Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.11;
Скачать: CL | DM;

Вниз

Быстрое чтение файла   Найти похожие ветки 

 
Fay ©   (2004-06-24 06:38) [40]

2Кастуся   (23.06.04 22:28) [37]
Твой способ удаления пробелов в строке ДИКО медленный.
Сравни с [33] на 10000 символах.


 
Кастуся   (2004-06-24 08:42) [41]


> Fay ©   (24.06.04 06:38) [40]

понимаю, что медленный, скажи как быстрее, чем предложил Romkin!


 
Кастуся   (2004-06-24 08:58) [42]


> Anatoly Podgoretsky ©   (23.06.04 22:58) [39]
> Для конвертации такой строки нужен Int128

такового типа нет в Дельфи! Как быть?


 
Fay ©   (2004-06-24 09:46) [43]

2Кастуся   (24.06.04 08:58) [42]
Правильно, нет. Но АП и не говорил, что нет - он сказал "нужен"


 
Fay ©   (2004-06-24 09:48) [44]

2Кастуся   (24.06.04 08:42) [41]
Сильно быстрее не получится. Не "стоит выделки".


 
имя   (2004-06-24 09:48) [45]

Удалено модератором


 
Fay ©   (2004-06-24 09:51) [46]

2www.shegeda.by.ru   (24.06.04 09:48) [45]
Какой выигрыш?


 
имя   (2004-06-24 09:58) [47]

Удалено модератором


 
имя   (2004-06-24 10:00) [48]

Удалено модератором


 
Кастуся   (2004-06-24 11:09) [49]


> www.shegeda.by.ru   (24.06.04 09:48) [45]

твой алгоритм не работает. Я его в процедуру пихаю:
procedure DelSpaces(var S: String);
var
NewLength : integer;
begin
asm
  mov edx, s
  mov ebx, s
  jmp @@NextChar
@@NextChar:
  mov al, [ebx]
  inc ebx
  or  al, al
  jz  @@StrEnd
  cmp al, " "
  je  @@NextChar
@@CopyChar:
  mov [edx], al
  inc edx
  jmp @@NextChar
@@StrEnd:
  mov [edx], al
  sub edx, s
  mov NewLength, edx
end;
SetLength(s,NewLength);
end;

> www.shegeda.by.ru   (24.06.04 09:58) [47]
> Это во-первых...
> Во вторых, нужно ли чтение файла?

когда я закомментировал всю обработку строк, а отавил только чтение стандартным методом:
while not eof(f) do
readln(f,st);

то мой файл в 8Мб прочитывает за 0.4с. Впечатляет? Так что с этим проблем нету.

А вообще, чего я уже добился с момента начала этой ветки, меня впечатляет! Скорость обработки увеличилась раза в 4-5!!!


 
Romkin ©   (2004-06-24 11:21) [50]

Не надо беспокоиться, думаю, DelSpaces в моей редакции уже перестала быть узким местом.
Простой пример: допустим, есть программа, и одна функция в ней отнимает 4% времени обработки. Ускорив эту функцию в два раза, вы получите уменьшение времени... всего на 2%.
ЛУчше посмотреть на другие участки программы...
А еще лучше воспользоваться профилировщиком


 
Fay ©   (2004-06-24 11:27) [51]

2Romkin ©   (24.06.04 11:21) [50]
К тому же, код [45] не годится для string 8)


 
Romkin ©   (2004-06-24 11:28) [52]

Кстати, насколько я понял, тебе значение строки не нужно? Тогда StrToInt64, но разбей строку на две половины - как раз влезет.
Может, все-таки скажешь, что у процедуры на входе и что нужно получить на выходе?


 
Anatoly Podgoretsky ©   (2004-06-24 11:32) [53]

www.shegeda.by.ru   (24.06.04 09:48) [45]
Ты диверсант?


 
имя   (2004-06-24 11:46) [54]

Удалено модератором


 
имя   (2004-06-24 12:07) [55]

Удалено модератором


 
Fay ©   (2004-06-24 12:19) [56]

2www.shegeda.by.ru   (24.06.04 11:46) [54]
Как Вы думаете, для чего Delphi вызывает UniqueStringA?


 
Anatoly Podgoretsky ©   (2004-06-24 12:22) [57]

www.shegeda.by.ru   (24.06.04 11:46) [54]
Так и продолжаешь провоцировать на неприятности в системе?


 
имя   (2004-06-24 12:27) [58]

Удалено модератором


 
Fay ©   (2004-06-24 12:37) [59]

2www.shegeda.by.ru   (24.06.04 12:27) [58]
Код скорее "для PChar". Delphi в таком случае лепит вполне пригодный код, хотя на asm-е легко сделать лучше 8).


 
имя   (2004-06-24 12:46) [60]

Удалено модератором


 
Fay ©   (2004-06-24 12:55) [61]

Можно глупый вопрос? А зачем вот такие FHandle:=0; штуки?!


 
имя   (2004-06-24 12:59) [62]

Удалено модератором


 
Fay ©   (2004-06-24 13:06) [63]

function TMappedFile.GetIsOpen: boolean;
begin
Result := FHandle <> DWORD(-1);
end;


 
Fay ©   (2004-06-24 14:22) [64]

Моя версия на основе www.shegeda.by.ru [60]
8)
unit MappedFile;

interface

uses
 Windows, SysUtils;

type
 TMappedFile = class
 private
   FHandle : DWORD;
   FMapping : DWORD;
   FSize : DWORD;
   FView : PChar;
   FActive : Boolean;
   FName : string;
   procedure SetSize(const Value : DWORD);
   procedure SetName(const Value : string);
   procedure SetActive(const Value : Boolean);
   function GetActive : Boolean;
 public
   constructor Create;
   destructor Destroy; override;
   procedure Close;
   procedure Open;
   property Size : DWORD read FSize write SetSize;
   property Data : PChar read FView;
   property Active : Boolean read GetActive write SetActive;
   property Name : string read FName write SetName;
 end;

implementation

constructor TMappedFile.Create;
begin
 FHandle := INVALID_HANDLE_VALUE;
 FName := "";
end;

destructor TMappedFile.Destroy;
begin
 Close;
 inherited;
end;

procedure TMappedFile.SetName(const Value : string);
begin
 if Active then
   raise Exception.Create("Нельзя изменить имя!");
 FName := Value;
end;

procedure TMappedFile.SetSize(const Value : DWORD);
begin
 if Active then
   raise Exception.Create("Нельзя изменить размер!");
 FSize := Value;
end;

procedure TMappedFile.SetActive(const Value : Boolean);
var
 sz : DWORD;
begin
 if FActive = Value then Exit;
 if Value then
   begin
     FHandle := CreateFile(
       PChar(FName),
       GENERIC_READ or GENERIC_WRITE,
       FILE_SHARE_READ,
       nil,
       OPEN_EXISTING,
       FILE_FLAG_RANDOM_ACCESS,
       0);
     if FHandle = INVALID_HANDLE_VALUE then
       RaiseLastOSError;
     sz := GetFileSize(FHandle, nil);
     if FSize > sz then
       begin
         SetFilePointer(FHandle, FSize, nil, FILE_BEGIN);
         SetEndOfFile(FHandle);
         SetFilePointer(FHandle, 0, nil, FILE_BEGIN);
       end
     else
       FSize := sz;
     FMapping := CreateFileMapping(
       FHandle,
       nil,
       PAGE_READWRITE,
       0, FSize,
       nil);
     if FMapping = 0 then
       begin
         CloseHandle(FHandle);
         FHandle := INVALID_HANDLE_VALUE;
         RaiseLastOSError;
       end;
     FView := MapViewOfFile(
       FMapping,
       FILE_MAP_ALL_ACCESS,
       0, 0,
       0);
     if FView = nil then
       begin
         CloseHandle(FHandle);
         CloseHandle(FMapping);
         FHandle := INVALID_HANDLE_VALUE;
         FMapping := 0;
         RaiseLastOSError;
       end;
     FSize := GetFileSize(FHandle, nil);
   end
 else
   begin
     UnmapViewOfFile(FView);
     CloseHandle(FMapping);
     CloseHandle(FHandle);
     FView := nil;
     FMapping := 0;
     FHandle := INVALID_HANDLE_VALUE;
   end;
 FActive := Value;
end;

function TMappedFile.GetActive : Boolean;
begin
 Result := FHandle <> INVALID_HANDLE_VALUE;
end;

procedure TMappedFile.Open;
begin
 Active := True;
end;

procedure TMappedFile.Close;
begin
 Active := False;
end;

end.


 
Fay ©   (2004-06-24 14:31) [65]

Пляски с sz в SetActive - левые 8)


 
Кастуся   (2004-06-24 17:12) [66]


> Romkin ©   (24.06.04 11:21) [50]
> ЛУчше посмотреть на другие участки программы...
> А еще лучше воспользоваться профилировщиком


А что такое профилировщикик? Это я так понимаю поределяет что сколько времени занимет в программе? Это какая-то программа и где её достать?


> Romkin ©   (24.06.04 11:28) [52]
> Кстати, насколько я понял, тебе значение строки не нужно?
> Тогда StrToInt64, но разбей строку на две половины - как
> раз влезет.

Я вот ут думаю, а будет ли это все быстрее работать, чем просто

HexSt:="0"+"1"+"2"+"3"+"4"+"5"+"6"+"7"+"8"+"9"+"a"+"b"+"c"+"d"+"e"+"f";
Bad:=not (LastDelimiter(HexSt,w0)=32);


 
Кастуся   (2004-06-24 18:35) [67]

короче пробовал я StrToInt64 - медленно работает


 
имя   (2004-06-24 19:21) [68]

Удалено модератором
Примечание: Смени ник


 
имя   (2004-06-24 20:30) [69]

Удалено модератором
Примечание: Смени ник.


 
Anatoly Podgoretsky ©   (2004-06-24 21:13) [70]

Слушай не лез бы ты в ассемблер, который раз по счету приводишь грубый и чрезвычайно опасный код. Ты бы хоть раз прочитал справку про встроеный ассемблер и соглашения.


 
Кастуся   (2004-06-24 22:01) [71]


> Anatoly Podgoretsky ©   (24.06.04 21:13) [70]
> Слушай не лез бы ты в ассемблер, который раз по счету приводишь
> грубый и чрезвычайно опасный код. Ты бы хоть раз прочитал
> справку про встроеный ассемблер и соглашения.

а чем приведённый код може быть опсаным?


 
Кастуся   (2004-06-25 10:08) [72]

Так чем?


 
Anatoly Podgoretsky ©   (2004-06-25 10:25) [73]

Неправильное использоние регистров, в результате могут быть выполнены недопустимые вещи, абсольтно любые и AV самое легкое что может произойти. Код абсолютно безграмотен, именно все приведеные с использование ассемблера.


 
Romkin ©   (2004-06-25 11:29) [74]

Упс... Все почистили. Зачем же красный карандаш, когда синего было достаточно?!

Кастуся  (24.06.04 17:12) [66] Да, именно определяет расход времени на разные функции. GPProfile, например. НАйти можно, достаточно поискать Delphi profiler ;)

И, кстати, почему бы просто не делать кусочную оптимизацию, а переписать все на конечный автомат? Уверяю, скорее всего быстрее, чем автомат ты вряд ли сделаешь.
И я уже пару раз просил дать постановку, а что собственно требуется-то? Улучшать код надо разумно, и, на мой взгляд, лезть в дебри ассемблера и проблемно-зависимой оптимизации кода надо в крайнем случае. Если скорость универсального короткого кода не устраивает, прежде всего надо посмотреть, нельзя ли сам алгоритм улучшить


 
Кастуся   (2004-06-25 15:57) [75]


> Romkin ©   (25.06.04 11:29) [74]

Может тебе интересно, конечно, что у меня за задача, но, еаверное, ИМХО лень будет тебе что-нибудь делать. В принципе, из этой ветки я извлек для себя массу полезного, благодаря чему, скорость работы моего алгоритма увеличилась в несколько раз.

> почему бы просто не делать кусочную оптимизацию, а переписать
> все на конечный автомат?

А можно пару слов про "конечный автомат"? Что енто такое и с чем его едят?

Так что спасибо огромное всем за помощь!


> Anatoly Podgoretsky ©   (25.06.04 10:25) [73]

а асм коды чьи-то там все равно не работали!


 
Anatoly Podgoretsky ©   (2004-06-25 16:03) [76]

Они могли работать в крайнем ограниченом количестве случаев, в большинстве случаев должны приводить к ошибке, хорошо если не критической.


 
Fay ©   (2004-06-25 16:32) [77]

2Кастуся   (25.06.04 15:57) [75]

> А можно пару слов про "конечный автомат"? Что енто такое
> и с чем его едят?

Вам не стыдно, товарищ? Интернет забит подобной инфой. Да и институте не умалчивают 8)


 
Romkin ©   (2004-06-25 16:36) [78]

>А можно пару слов про "конечный автомат"? Что енто такое и с чем его едят?
НУ я же уже давал:
Romkin ©  (23.06.04 18:09) [31]
Основная идея простая: файл рассматривается как непрерывный поток байт, каждый из которых проходит через "фильтр", который реагирует на него изменением состояния (и данных). В результате - DelSpaces, например, вообще не нужна будет, реакция на пробел простая - continue :))


 
Кастуся   (2004-06-25 18:39) [79]

классно конечно

Ладно всем спасибо!!!


 
Кастуся   (2004-06-27 09:32) [80]

Снова чуть-чуть продолжим

> Romkin ©   (25.06.04 16:36) [78]

Если считывать файл побайтно, возникает проблема с определением положения троки идентификатора. Вот задача:
в общем случае есть в тексте сообщение вида:
MESSAGE: ## ## ##  ## ## ##;
Необходимо его идентифицировать и получить, то что находится вместо #. Вот. как это реализ с пом-ю конечн автомата?



Страницы: 1 2 3 вся ветка

Текущий архив: 2004.07.11;
Скачать: CL | DM;

Наверх




Память: 0.64 MB
Время: 0.036 c
1-1087928731
georg
2004-06-22 22:25
2004.07.11
StringGrid Фиксирование ячеек


6-1084522330
0597345
2004-05-14 12:12
2004.07.11
Как работать с WinSock на АПИ?


14-1087803385
WondeRu
2004-06-21 11:36
2004.07.11
Помогите решить задачку!


6-1084464909
Zelius
2004-05-13 20:15
2004.07.11
Скорость скачивания в Indy


3-1087387328
serg128
2004-06-16 16:02
2004.07.11
Как добавить колонку в DBGrid?