powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Оптимизация побайтового чтения и сравнения двух бинарных файлов
112 сообщений из 112, показаны все 5 страниц
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39572066
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу знатоков помочь с оптимизацией побайтового чтения и сравнения двух бинарных файлов!

Ниже приведен несколько урезанный код самой процедуры...
(прошу не пинать за возможно большой код... но иначе возможно было бы больше от Вас уточнений и ухода темы в сторону)

Данная тема перекликается с моей же темой " Вывод в Memo японских иероглифов (932-я кодовая таблица) ", но об этом позже.

Немного словесного описания:
Процедура оперирует двумя бинарными файлами одинаковой длины:
- OriginalFile - бинарный файл в котором встречаются английские и японские текстовые фразы (в 932 или 20932 -й кодировке) с лидирующими и замыкающими нулевыми байтами;
- PerevedenFile - бин.файл созданный на основе предыдущего Оригинала, но японские фразы заменены на их английские аналоги, т.е. Переведены с учетом длины японской фразы включая Пред.и После-нули. Данный файл может быть "переведен" предварительно вручную или др.программой, это не важно!

Задача процедуры - на основании информации из файлов OriginalFile и PerevedenFile сформировать текстовый файл PerevodFile со структурой, упрощенно похожей на XML, который можно будет открывать для просмотра в текстовом редакторе (в дальнейшем буду иметь ввиду " Notepad++ "), так и в "WinHex".

Пришло время привести тестовые примеры этих Трех файлов, а затем - структуру выходного файла PerevodFile !?

OriginalFile :


PerevedenFile :


PerevodFile :


Но лучше на него взглянуть из " Notepad++ " (включена индикация "Всех" символов):
Эхх - картинка длинная получилась!..((( Надеюсь на 14'-вом монике никто не читает?..)

Или можно скопировать его сюда:
Код: xml
1.
2.
*#0082B182F182C982BF82CD000000#00476F6F64206D6F726E696E6700#こんにちは#Good morning#...You comments...##
*#00834F836283688378834300#00476F6F6420626179000000#グッドベイ#Good bay#...You comments...##

Правда упр.символов " CR " " LF " тут видно не будет!
Иероглифы скорее всего - тоже не проявятся..((
Тогда попробую еще просто вставить (да простят меня Модераторы и Админы форума!):

*#0082B182F182C982BF82CD000000#00476F6F64206D6F726E696E6700#こんにちは#Good morning#...You comments...##
*#00834F836283688378834300#00476F6F6420626179000000#グッドベイ#Good bay#...You comments...##


Внимательные глаза возможно уже сами увидели формат выходного файла!?..))
Сейчас останавливаться на нем больше не буду, если надо будет - распишу его структуру!

Зачем я это все пишу и вставляю картинки?
Да просто опережаю время, предвидя возможные наводящие вопросы и уточнения - стараюсь выложить всю начальную информацию!

Ну а тем, кто дочитал до этого места - собственно попробую сформулировать свой вопрос согласно топика...


Как видите - для чтения отдельных байт из файлов я использовал TFileStream , просто на этапе правильного составления алгоритма, так было удобней и легче!
Но читать по одному байту - как то не очень шустро получается!
Подскажите пожалуйста, для реализации данного алгоритма - какие варианты можно еще попробовать???

А тут сам код процедуры:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
//------------------------------------------------------------------------------------------
procedure TMainForm.MainProcess(Sender: TObject);
var
SizeOriginal, SizePereveden: Integer;
Address: Integer;
SizeFraza: Integer;
NumberString: Integer; // Номер строки Перевода
i: Integer;
FrazaOk: Boolean; // Флаг найденного различия в фразах
begin
     MainMemo.Lines.Clear;
     // Считываем имена файлов из Полей редактирования (возможно редактировались!)
     FullOriginalFileName := FileBinOriginalEdit.Text;
     FullPerevedenFileName := FileBinPerevedenEdit.Text;
     FullPerevodFileName := DirPerevodEdit.Text + PerevodFileNameEdit.Text;

     try
          FOriginal:=TFileStream.Create(FullOriginalFileName, fmOpenRead, fmshareCompat);
          SizeOriginal := FOriginal.Size;
          FPereveden:=TFileStream.Create(FullPerevedenFileName, fmOpenRead, fmshareCompat);
          SizePereveden := FPereveden.Size;

          if SizeOriginal <> SizePereveden then
               begin  MainMemo.Lines.Add('Длины BIN-файлов НЕ РАВНЫ! Продолжение Невозможно!');
                      Exit;
               end;
          AddressFiles := 0;
          NumberString := 0;

          while AddressFiles < SizeOriginal do
               begin
                    TwoBytesRead(MainForm);  // Читаем ISimvol и PSimvol

                    if (ISimvol=0) and (PSimvol=0) then
                         begin
                              Address := AddressFiles;
                              SizeFraza := 1;
                              Inc(AddressFiles);
                              if AddressFiles >= SizeOriginal then Exit;

                              TwoBytesRead(MainForm);  // Читаем ISimvol и PSimvol

                              if (ISimvol<>0) and (PSimvol<>0) then
                                   begin
                                        FrazaOk:=False; // Сбрасываем флаг перед анализом.
                                        repeat
                                             if ISimvol<>PSimvol then FrazaOk:=True; // Нашли Разные байты в фразах

                                             Inc(SizeFraza);
                                             Inc(AddressFiles);

                                             if AddressFiles >= SizeOriginal then Exit;

                                             TwoBytesRead(MainForm);  // Читаем ISimvol и PSimvol
                                        until (ISimvol=0) and (PSimvol=0);

                                        if FrazaOk=True then
                                             begin
                                                  Inc(SizeFraza);
                                                  Inc(NumberString);

                                                  // Первые два Символа строки: "*#"
                                                  MainMemo.Lines.Add('*#');

                                                  // Пишем Исходные (JP_HEX)-----------------------------
                                                  for i:=0  to SizeFraza-1 do
                                                       begin
                                                            FOriginal.Seek((Address + i), soFromBeginning);
                                                            FOriginal.ReadBuffer(ISimvol,1);

                                                            MainMemo.Lines[MainMemo.Lines.Count-1]:=MainMemo.Lines[MainMemo.Lines.Count-1] +
                                                            IntToHex(ISimvol, 2);
                                                       end;
                                                  MainMemo.Lines[MainMemo.Lines.Count-1]:=MainMemo.Lines[MainMemo.Lines.Count-1] + '#';

                                                  // Пишем переведенные (ENG_HEX)------------------------
                                                  for i:=0  to SizeFraza-1 do
                                                       begin
                                                            FPereveden.Seek((Address + i), soFromBeginning);
                                                            FPereveden.ReadBuffer(PSimvol,1);

                                                            MainMemo.Lines[MainMemo.Lines.Count-1]:=MainMemo.Lines[MainMemo.Lines.Count-1] +
                                                            IntToHex(PSimvol, 2);
                                                       end;
                                                  MainMemo.Lines[MainMemo.Lines.Count-1]:=MainMemo.Lines[MainMemo.Lines.Count-1] + '#';

                                                  // Пишем исходные байты (JP_TXT)-----------------------
                                                  for i := 1 to SizeFraza-2 do
                                                       begin
                                                            FOriginal.Seek((Address + i), soFromBeginning);
                                                            FOriginal.ReadBuffer(ISimvol,1);

                                                            // Если это LF, то меняем его на "@"
                                                            if ISimvol=10 then ISimvol := 64; // 40 hex

                                                            MainMemo.Lines[MainMemo.Lines.Count-1]:=MainMemo.Lines[MainMemo.Lines.Count-1] +
                                                            AnsiChar(ISimvol);
                                                       end;
                                                  MainMemo.Lines[MainMemo.Lines.Count-1]:=MainMemo.Lines[MainMemo.Lines.Count-1] + '#';

                                                  // Пишем переведенные байты (ENG_TXT)------------------
                                                  for i := 1 to SizeFraza-2 do
                                                       begin
                                                            FPereveden.Seek((Address + i), soFromBeginning);
                                                            FPereveden.ReadBuffer(ISimvol,1);

                                                            // Если это LF, то меняем его на "@"
                                                            if ISimvol=10 then ISimvol := 64; // 40 hex

                                                            MainMemo.Lines[MainMemo.Lines.Count-1]:=MainMemo.Lines[MainMemo.Lines.Count-1] +
                                                            AnsiChar(ISimvol);
                                                       end;
                                                  MainMemo.Lines[MainMemo.Lines.Count-1]:=MainMemo.Lines[MainMemo.Lines.Count-1] +
                                                   '#' + '...You comments...' + '##';
                                             end;
                                   end;
                         end
                     else
                         begin
                              Inc(AddressFiles);
                         end;
               end;
     finally
          FOriginal.Free;
          FPereveden.Free;

          MainMemo.Lines.SaveToFile(FullPerevodFileName); // Сохраняем Мемо в файл
          MainMemo.Lines.Add('Файл-Переводов "'+ FullPerevodFileName + ' записан!');

          if DublicateDel=True then // Если флаг УдаленияДублей=1, удаляем дубли
               begin  MainMemo.Lines.Add('Удаляем дубликаты строк в Файле-Переводов... "');
                         DublicateDelete(MainForm); // Процедура удаления дубликатов строк
               end;
          MainMemo.Lines.Add('Обработка файлов завершена!');
          if NumberString=0 then MainMemo.Lines.Add('Различий в Двоичных файлах не найдено!')
          else MainMemo.Lines.Add('Найдено Фраз-Перевода: ' + IntToStr(NumberString));
     end;
end;
//----------------------------------------------------------------------------------------------------


Для побайтного-посимвольного накопления выходного файла я использовал TMemo с последующей процедурой удаления дублей строк (ее текст тут упущен..) и выгрузкой его в файл.
Хотя наверное для этого можно использовать и TStringList !? - Надо попробовать его.

Формат получаемого файла " Perevod " полностью меня устраивает, единственное, что никак не могу понять:

MainMemo :


При выводе в TMemo всего этого "bla-bla-bla...", вместо японских иероглифов присутствую совсем другие символы!
(А в свойствах TMemo.Font зачем тогда присутствует выбор кодировки, в том числе 932 !? )

НО!!! - Вопрос по TMemo.Font - это совсем другая история и я уже начал по ней дискуссию ТАМ .

P.S. В данном топике меня интересует прежде всего - варианты оптимизации чтения!
(Ну а дальше - что позволят уважаемые Модераторы...)
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39572100
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicПодскажите пожалуйста, для реализации данного алгоритма - какие варианты можно еще попробовать???
Можно начать отсюда https://www.google.com/search?q=delphi buffered file stream
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39572120
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic(Ну а дальше - что позволят уважаемые Модераторы...)
Модератор настоятельно советует не злоупотреблять оформлением.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39572240
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

Я нифига не понял, чего тебе нужно. Изложи вопрос компактнее, пожалуйста

От себя замечу, что UniConv поддерживает 932 и 20932 кодировки. А значит и CachedTexts поддерживает их.
Значит ты можешь делать построчные Readln и вообще как угодно работать с текстом. Хоть через автокоррекцию в UTF8, хоть в Unicode, хоть в 51949
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39572293
utf8 ? ... ...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
var
 LPos : Int64;
 ISymbol, PSymbol : Byte;
begin
 OpenFiles();
 if FOriginal.Size = FPereveden.Size then
    for LPos := 0 to FOriginal.Size div SizeOf(ISymbol) - 1 do begin
        FOriginal.Read(ISymbol, SizeOf(ISymbol));
        FPereveden.Read(PSymbol, SizeOf(PSymbol));
        if ISymbol<>PSymbol then Break;
    end;
 CloseFiles();
end;
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39572307
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUUniConv поддерживает 932 и 20932 кодировки. А значит и CachedTexts поддерживает их.
дальше все про блох....
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39572513
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadmanМожно начать отсюда https://www.google.com/search?q=delphi buffered file stream
wadman , Вам - большое спасибо за подсказку, а разработчикам за такой подарок - давно бы стоило это сделать!..)

Замена TFileStream на TBufferedFileStream на тестовом примере от сюда ( Faster FileStream with TBufferedFileStream ) выдала офигительный результат - вместо 2491 msec, тест сработал за 31 msec (это более чем в 80 раз быстрее!)
Только автор что-то там не так немного с подсчетом символа "#13" накрутил..) - я не стал разбираться.
Тестовый код из статьи
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
unit MainModule;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Diagnostics, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    btnWrite: TButton;
    btnRead: TButton;
    btnReadBuffered: TButton;
    procedure btnWriteClick(Sender: TObject);
    procedure btnReadClick(Sender: TObject);
    procedure btnReadBufferedClick(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//==============================================================================
procedure TForm1.btnWriteClick(Sender: TObject);
var
  sw: TStreamWriter;
  I: Integer;
begin
  sw := TStreamWriter.Create('test.txt', False, TEncoding.UTF8);
  try
    // write 10K lines
    sw.WriteLine ('Hello, world');
    for I := 1 to 99999 do
      sw.WriteLine ('Hello ' + I.ToString);
 finally
   sw.Free;
 end;
 Memo1.Lines.Add ('File written');

end;
//==============================================================================
procedure TForm1.btnReadClick(Sender: TObject);
var
 fStr: TFileStream;
 Total, I: Integer;
 sw: TStopwatch;
 ch: Char;
begin
  sw := TStopwatch.StartNew;
  fStr := TFileStream.Create('test.txt', fmOpenRead);
  try
    Total := 0;
    while fStr.Read (ch, 1) = 1 do begin
      if ch = #13 then
        Inc(Total);
    end;
    Memo1.Lines.Add ('Lines: ' + Total.ToString);
  finally
    fStr.Free;
  end;
  sw.Stop;
  Memo1.Lines.Add ('msec: ' + sw.ElapsedMilliseconds.ToString);

end;
//==============================================================================
procedure TForm1.btnReadBufferedClick(Sender: TObject);
var
  fStr: TBufferedFileStream;
  Total, I: Integer;
  sw: TStopwatch;
  ch: Char;
begin
  sw := TStopwatch.StartNew;
  fStr := TBufferedFileStream.Create('test.txt', fmOpenRead);
  try
    Total := 0;
    while fStr.Read (ch, 1) = 1 do
     begin
      if ch = #13 then
        Inc(Total);
     end;
    Memo1.Lines.Add ('Lines: ' + Total.ToString);
  finally
    fStr.Free;
  end;
  sw.Stop;
  Memo1.Lines.Add ('msec: ' +   sw.ElapsedMilliseconds.ToString);

end;
//==============================================================================
end.

Правда чтоб это работало - необходима свежая редакция Delphi - у меня стоит XE3 и 10.2.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39572565
|:|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
|:|
Гость
BellicДля побайтного-посимвольного накопления выходного файла я использовал TMemo Bellic... выдала офигительный результат - вместо 2491 msec, тест сработал за 31 msec (это более чем в 80 раз быстрее!)
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39572596
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Глянул на исходники...

Я уже писал вам в другой теме, что код вида
Код: pascal
1.
2.
3.
4.
5.
6.
for i := 0 to SizeFraza - 1 do
begin
  FOriginal.Seek((Address + i), soFromBeginning);
  FOriginal.ReadBuffer(ISimvol, 1);
  MainMemo.Lines[MainMemo.Lines.Count-1] := MainMemo.Lines[MainMemo.Lines.Count-1] + IntToHex(ISimvol, 2);
end;

и слово "скорость", взаимосвязаны примерно как гиппопотам и стратосферные полёты.

Ради интереса, запустите своё приложение в режиме отладчика (с включенной опцией Use Debug DCUs ) и пройдитесь кнопкой F7 (Trace Into) по этому циклу, посмотрите сколько и какого кода там выполняется.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39572627
SoftForYou
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BellicwadmanМожно начать отсюда https://www.google.com/search?q=delphi buffered file stream
wadman , Вам - большое спасибо за подсказку, а разработчикам за такой подарок - давно бы стоило это сделать!..)

Замена TFileStream на TBufferedFileStream на тестовом примере от сюда ( Faster FileStream with TBufferedFileStream ) выдала офигительный результат - вместо 2491 msec, тест сработал за 31 msec (это более чем в 80 раз быстрее!)
Только автор что-то там не так немного с подсчетом символа "#13" накрутил..) - я не стал разбираться.
Тестовый код из статьи
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
unit MainModule;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Diagnostics, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    btnWrite: TButton;
    btnRead: TButton;
    btnReadBuffered: TButton;
    procedure btnWriteClick(Sender: TObject);
    procedure btnReadClick(Sender: TObject);
    procedure btnReadBufferedClick(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//==============================================================================
procedure TForm1.btnWriteClick(Sender: TObject);
var
  sw: TStreamWriter;
  I: Integer;
begin
  sw := TStreamWriter.Create('test.txt', False, TEncoding.UTF8);
  try
    // write 10K lines
    sw.WriteLine ('Hello, world');
    for I := 1 to 99999 do
      sw.WriteLine ('Hello ' + I.ToString);
 finally
   sw.Free;
 end;
 Memo1.Lines.Add ('File written');

end;
//==============================================================================
procedure TForm1.btnReadClick(Sender: TObject);
var
 fStr: TFileStream;
 Total, I: Integer;
 sw: TStopwatch;
 ch: Char;
begin
  sw := TStopwatch.StartNew;
  fStr := TFileStream.Create('test.txt', fmOpenRead);
  try
    Total := 0;
    while fStr.Read (ch, 1) = 1 do begin
      if ch = #13 then
        Inc(Total);
    end;
    Memo1.Lines.Add ('Lines: ' + Total.ToString);
  finally
    fStr.Free;
  end;
  sw.Stop;
  Memo1.Lines.Add ('msec: ' + sw.ElapsedMilliseconds.ToString);

end;
//==============================================================================
procedure TForm1.btnReadBufferedClick(Sender: TObject);
var
  fStr: TBufferedFileStream;
  Total, I: Integer;
  sw: TStopwatch;
  ch: Char;
begin
  sw := TStopwatch.StartNew;
  fStr := TBufferedFileStream.Create('test.txt', fmOpenRead);
  try
    Total := 0;
    while fStr.Read (ch, 1) = 1 do
     begin
      if ch = #13 then
        Inc(Total);
     end;
    Memo1.Lines.Add ('Lines: ' + Total.ToString);
  finally
    fStr.Free;
  end;
  sw.Stop;
  Memo1.Lines.Add ('msec: ' +   sw.ElapsedMilliseconds.ToString);

end;
//==============================================================================
end.

Правда чтоб это работало - необходима свежая редакция Delphi - у меня стоит XE3 и 10.2.

Чё-то не понял, у тебя же файл японский, а не юникодовый. Почему ты читаешь Char?
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39572631
SoftForYou
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И какой вообще смысл читать посимвольно файл?
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39572658
SoftForYou
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
type
  TJapaneesTextReader = class(TUTF16TextReader)
  public
    constructor Create(const Source: TCachedReader; const Owner: Boolean);
    constructor CreateFromFile(const FileName: string);
  end;

constructor TJapaneesTextReader.Create(const Source: TCachedReader; const Owner: Boolean);
var
  Context: PUniConvContext;
begin
  Context := Self.GetInternalContext;
  Context.Init(CODEPAGE_UTF16, 20932, ccOriginal);
  CreateDirect(Context, Source, Owner);
end;

constructor TJapaneesTextReader.CreateFromFile(const FileName: string);
begin
  FFileName := FileName;
  Create(TCachedFileReader.Create(FileName), True);
end;



А потом читаешь построчно:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
var
  S: UTF16String{быстрее} или UnicodeString; 
  Reader: TJapaneesTextReader;
begin
  Reader := TJapaneesTextReader.CreateFromFile(имя файла);
  try
    while Reader.Readln(S) do
    begin
      // ToDo
    end;
  finally
    Reader.Free;
  end;
end;



А посимвольно можно так. Для Char (WideChar) можно сделать быстрее, только расписывать не буду :)
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
var
  C: UCS4Char;
  Reader: TJapaneesTextReader;
begin
  Reader := TJapaneesTextReader.CreateFromFile(имя файла);
  try
    while not Reader.EOF do
    begin
      C := Reader.ReadChar;
      // ToDo
    end;
  finally
    Reader.Free;
  end;
end;
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39572664
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvpГлянул на исходники...

Я уже писал вам в другой теме, что код вида
Код: pascal
1.
2.
3.
4.
5.
6.
for i := 0 to SizeFraza - 1 do
begin
  FOriginal.Seek((Address + i), soFromBeginning);
  FOriginal.ReadBuffer(ISimvol, 1);
  MainMemo.Lines[MainMemo.Lines.Count-1] := MainMemo.Lines[MainMemo.Lines.Count-1] + IntToHex(ISimvol, 2);
end;

и слово "скорость", взаимосвязаны примерно как гиппопотам и стратосферные полёты.

Ради интереса, запустите своё приложение в режиме отладчика (с включенной опцией Use Debug DCUs ) и пройдитесь кнопкой F7 (Trace Into) по этому циклу, посмотрите сколько и какого кода там выполняется.
Рано я обрадовался!!!
Замена TFileStream на TBufferedFileStream в реальной процедуре скорости ей не прибавила, и даже наоборот (было 193 сек, а стало - 196 сек)!

И с Вам, alekcvp , я тоже полностью согласен, что вышеуказанный цикл "гиппопотамовский"!

Индикация в Memo в принципе вообще не нужна, а произвести формирование Выходного файла думаю можно и в TStringList , а потом командой SaveToFile сохранить его в файле!?
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39572669
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SoftForYouЧё-то не понял, у тебя же файл японский, а не юникодовый. Почему ты читаешь Char?
Вообще то читаю и анализирую побайтно (ISimvol, PSimvol: Byte;) потому, что в Исходных файлах могут быть не только 2-х байтные, но и 1-байтные японские символы (932 и 20932-й кодировок), латиница, а так же просто например машинный код для процессора!

SoftForYou , я ответил на Ваш вопрос?
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39572675
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SoftForYouИ какой вообще смысл читать посимвольно файл?
Исходные файлы OriginalFile и PerevedenFile - это Бинарники, а не Текстовые!
Это вообще-то "прошивки" для электронных устройств (машинный код!) с некоторым числом Текстовых фраз!
По другому тут я думаю никак не получится!
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39572759
Bellicэто Бинарники, а не Текстовые!Bellic, методичку по массивам почитай ))
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39572776
SoftForYou
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bellic,

Тогда тебе нужен CachedBuffers
По сути тебе нужен только CachedBuffers.pas

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
var
  B: Byte;
  Reader: TCachedFileReader;
begin
  Reader := TCachedFileReader.Create(имя файла);
  try
    while (not Reader.EOF) do
    begin
      Reader.ReadData(B);
      // ToDo
    end;
  finally
    Reader.Free;
  end;



Это самый быстрый способ побайтного чтения твоих файлов
Но я думаю, скорость у тебя проседает не на чтении файлов, а в каких-то других местах, например, при переводе строки в юникод
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39572915
ОнСамый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попкорновый файлBellicэто Бинарники, а не Текстовые!Bellic, методичку по массивам почитай ))
На предмет чего?
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39573188
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Думал насчет использования массивов, но пока решил повременить...

В общем отказался от TMemo для "формирования и накопления" строк и последующего сохранения его в файл...
(Вывод в TMemo оставил только для информационных сообщений)
Чтение бинарников оставил через TFileStream .

Сейчас это выглядит примерно так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
MString: TStrings;
SStroka: AnsiString;
...
MString := TStringList.Create;
...
SStroka := '*#';
...
for i := 0 to SizeFraza - 1 do
begin
  FOriginal.Seek((Address + i), soFromBeginning);
  FOriginal.ReadBuffer(ISimvol, 1);
  //MainMemo.Lines[MainMemo.Lines.Count-1] := 
  //      MainMemo.Lines[MainMemo.Lines.Count-1] + IntToHex(ISimvol, 2);
  SStroka := SStroka + IntToHex(ISimvol, 2);
end;
...
MString.Add(SStroka);
...
MString.SaveToFile(FileName);


В результате - время выполнения процедуры от 193 секунд уменьшилось до 87 !
(Забыл ранее упомянуть, что размер бинарников - каждый примерно по 10 Мбайт )

В принципе - результатом более или менее доволен, но думаю что можно еще подчистит код или попробовать другие варианты реализации, в том числе и с Массивами!
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39573273
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic(Забыл ранее упомянуть, что размер бинарников - каждый примерно по 10 Мбайт )
Копейки... Можно разом загрузить и не дергать чтение по байтам.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39573343
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicСейчас это выглядит примерно так:
Код: pascal
1.
2.
3.
4.
for i := 0 to SizeFraza - 1 do
begin
  FOriginal.Seek((Address + i), soFromBeginning);
  FOriginal.ReadBuffer(ISimvol, 1);



1. При последовательном чтении Seek() делать не надо, Read[Buffer]() сама переносит указатель на Count позиций вперёд.
2. Для разнообразия:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
  const
    HexChars: array [0..15] of AnsiChar = '0123456789ABCDEF';
  var
    Buffer: TBytes;
    SStroka: AnsiString;
  ...
  SetLength(SStroka, (SizeFraza + 1) * 2);
  SStroka[1] := '*';
  SStroka[2] := '#';  
  ... 
  SetLength(Buffer, SizeFraza);
  FOriginal.Seek(Address, soFromBeginning);
  FOriginal.ReadBuffer(Buffer[0], SizeFraza); // чтение не побайтное, а одним куском
  for i := 0 to SizeFraza - 1 do begin
    SStroka[i * 2 + 3] := HexChars[Buffer[i] shr 4];
    SStroka[i * 2 + 4] := HexChars[Buffer[i] and $0F];
  end;
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39573396
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

Загрузи исходные файлы в память, так будет быстрее и удобнее
А запись в файл у тебя очень долгая - ты постоянно перевыделяешь строки и используешь конкатенацию. Тебе нужно использовать TCachedTextWriter и TTemporaryString. В общем не очень ясно, зачем ты у нас что-то спрашиваешь, если вообще не прислушиваешься к тому, что мы говорим :)
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39573535
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SoftForYouBellic,
Тогда тебе нужен CachedBuffers
По сути тебе нужен только CachedBuffers.pas
я так понимаю - это компонент? Возможно попробую чуть позже... правда это утяжелит программу...

wadman..Можно разом загрузить и не дергать чтение по байтам.
Думаю Вы правы! Но в 2-х циклах из 4-рех идет не только побайтное чтение, но и анализ этих данных, да и обвязка для "загрузки разом" будет стоить некоторого кода..(

alekcvp1. При последовательном чтении Seek() делать не надо, ReadBuffer]() сама переносит указатель на Count позиций вперёдЭто известно мне, Seek() остался от вырисовывания алгоритма, сейчас приведу в порядок где это возможно. Спасибо за подсказку!

alekcvp
2. Для разнообразия:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
  const
    HexChars: array [0..15] of AnsiChar = '0123456789ABCDEF';
  var
    Buffer: TBytes;
    SStroka: AnsiString;
  ...
  SetLength(SStroka, (SizeFraza + 1) * 2);
  SStroka[1] := '*';
  SStroka[2] := '#';  
  ... 
  SetLength(Buffer, SizeFraza);
  FOriginal.Seek(Address, soFromBeginning);
  FOriginal.ReadBuffer(Buffer[0], SizeFraza); // чтение не побайтное, а одним куском
  for i := 0 to SizeFraza - 1 do begin
    SStroka[i * 2 + 3] := HexChars[Buffer[i] shr 4];
    SStroka[i * 2 + 4] := HexChars[Buffer[i] and $0F];
  end

;
Это еще не совсем понял, разберусь думаю..

SOFT FOR YOUЗагрузи исходные файлы в память, так будет быстрее и удобнееОтличная идея!!! Следующий вариант попробую именно его!
А запись в файл у тебя очень долгая - ты постоянно перевыделяешь строки и используешь конкатенацию.Конкатенацию юзать удобно - не надо следить за указателем позиции.
А запись в файл в свете варианта использования " TStringList ", выглядит одной строкой:
Код: pascal
1.
MString.SaveToFile(FileName);


Тебе нужно использовать TCachedTextWriter и TTemporaryString. В общем не очень ясно, зачем ты у нас что-то спрашиваешь, если вообще не прислушиваешься к тому, что мы говорим :)
SOFT FOR YOU , я думаю Вы зря обвиняете меня в невнимательности к предложениям пользователей!
Замену TFileStream на TBufferedFileStream попробовал;

От TMemo с позицированием в нем (типа " Memo.Lines[Memo.Lines.Count-1]:=Memo.Lines[Memo.Lines.Count-1] + '#'; ") тоже избавился.

Массив частично заюзал - " SStroka: AnsiString; " - это же по сути тот же массив, но символьный!?

...при возможности - обязательно попробую предложенные Вами варианты...

P . S . К сожалению (или к счастью?!) мы все люди (как ни странно...), а не машины!
У каждого свои достоинства, недостатки и Время - для их приумножения или искоренения!...
Спасибо Всем, за то что Вы сейчас со мной, здесь и сейчас!!!
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39573834
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

>Конкатенацию юзать удобно - не надо следить за указателем позиции.

Удобно, но медленно. Указатель - всего лишь одна переменная + 1-2 строки кода. Многократное ускорение стоят того, что бы разобраться.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39573898
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaonBellic,

>Конкатенацию юзать удобно - не надо следить за указателем позиции.

Удобно, но медленно. Указатель - всего лишь одна переменная + 1-2 строки кода. Многократное ускорение стоят того, что бы разобраться.
Ну я не стою на месте...
Правда неудачно "выкосил" Seek , в результате чего сломался алгоритм и в выходном файле появились ошибочные данные...((
Будет время - пройдусь пошагово на тестовых файлах...
А уже после этого - буду думать что еще можно оптимизировать! Хотелось бы дорешать этот вариант!
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39573985
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

Не, ну я здесь как бы самый главный специалист по оптимизациям и тексту
А ты меня игнорируешь. Мне обидно

Что до компонента - это открытие библиотеки на гитхабе. Ссылку я тебе дал, а если что - достаточно легко гуглится
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39573991
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicА уже после этого - буду думать что еще можно оптимизировать!
Не слушай прематурщиков. На избавлении от конкатенации ты много не сэкономишь. В современных дельфях очень хороший менеджер памяти (FastMM), которому многократные запросы на ресайз не страшны. Вот на избавлении от множества дисковых операций сэкономить можно, да. Кроме этого, у тебя есть ещё один косяк, который может изрядно тормозить. Замени свою AnsiString на UnicodeString или просто на String, и посмотри, что будет.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39573994
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUНе, ну я здесь как бы самый главный специалист по оптимизациям и тексту
...самопровозглашённый
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39573998
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey...самопровозглашённый
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39574022
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

померял на xe6 - разница в 10 раз, конкатенация против заполнения. хотя, конечно, на современных процессорах возможно и незаметно особо будет на небольших наборах.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39574029
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonпомерял на xe6 - разница в 10 раз
Ты померял конкатенацию в вакуме. Я тоже померял. Взял 10 мегабайт, и конкатенацией, побайтово, присовокупил к строке (s := s + IntToHex(b, 2)). Заняло это действо... 500msec. Аж целых пол-секунды. У топикстартера задача длится больше минуты. Ну и какая ему радость, от того, что усложнением кода удастся уменьшить 500msec до 50?
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39574032
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

понятно, что основные тормоза там на дисковых операциях. однако и это место можно вполне улучшить.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39574034
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonпонятно, что основные тормоза там на дисковых операциях
Вот тоже не факт. Дисковый кеш тоже не просто так существует.

makhaonоднако и это место можно вполне улучшить.
Нечего там экономить. У него больше потерь на конвертировании UnicodeString <> AnsiString происходит.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39574053
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

побайтное чтение - тоже не сахар. сложно сказать, что тормозит больше. есть куда оптимизировать.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39574060
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Конкатенация это не ресайз
Здесь вообще кроме дисковых операций, работы с памятью и конвертации - ничего нет
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39574081
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonпобайтное чтение - тоже не сахар.
И именно поэтому экономить на конкатенации в данном случае - прематурщина.

SOFT FOR YOUКонкатенация это не ресайз
Многократный запрос на ресайз это то, чем отличается конкатенация в цикле от варианта с предварительным резервированием.

SOFT FOR YOUЗдесь вообще кроме дисковых операций, работы с памятью и конвертации - ничего нет
Ты вообще-то говорил, что тут строки постоянно перевыделяются. А они таки нет. Вот то что они постоянно конвертируются, это таки да.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39574089
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Если я ничего не путаю
То в данном коде выделяется 2 новые строки
Код: pascal
1.
SStroka := SStroka + IntToHex(ISimvol, 2);
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39574093
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

На первой итерации цикла. Потом одна строка (т.е. память под неё) постепенно ресайзится, а вторая остаётся неизменной до конца цикла (т.к. многие функции возращающие строки не инициализируют результат, а просто изменяют размер. Ну а если размер постоянный...).
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575127
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем - еще раз провел "ревизию" алгоритма, убрав "Seek" и прочее в своей Полной программе...
Результат, которого мне добиться на сегодняшний день - 43,7 секунды на двух файлах точного размера 9 967 616 байт.
Замер производился на Delphi 10.2 ( DX ) в режиме Debug (В режиме Release видимо будет чуток побыстрее!?)
Код пока не буду приводить - если кто захочет, покажу чуть позже

Большие задержки вносят примерно такие операторы, как:
- FOriginal.Position
- Application.ProcessMessages ;
- возможно SStroka := SStroka + AnsiChar(ISimvol) ;

А сейчас мне хотелось бы предложить провести некоторый тест части кода - это самый первый цикл поиска Нулевых байт в обоих файлах. Полученный результат - это будет Минимальное время, к которому нужно стремиться при используемом способе побайтного чтения! Исходя из полученного времени выполнения можно будет судить о времени выполнения ПОЛНОЙ программы.
Сейчас я приведу код, и вы я думаю поймете о чем я!

Данный вариант использует TFileStream:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
procedure TMainForm.TestButtonClick(Sender: TObject);
var
SizeOriginal: Integer;
SizePereveden: Integer;
begin
     try
          StartTime := Now;        // Фиксируем время Старта
          // Считываем имена файлов из Полей редактирования (возможно редактировались!)
          FullOriginalFileName := FileBinOriginalEdit.Text;
          FullPerevedenFileName := FileBinPerevedenEdit.Text;
          FullPerevodFileName := DirPerevodEdit.Text + PerevodFileNameEdit.Text;

          // Для варианта с TFileStream
          FOriginal := TFileStream.Create(FullOriginalFileName, fmOpenRead, fmShareDenyNone);
          SizeOriginal := FOriginal.Size;
          FPereveden := TFileStream.Create(FullPerevedenFileName, fmOpenRead, fmShareDenyNone);
          SizePereveden := FPereveden.Size;

          AddressFiles := 0;
          ProgressBar.Max := SizeOriginal;

          //===== Встали на Начало в Обоих файлах =====
          FOriginal.Seek(AddressFiles, soFromBeginning);
          FPereveden.Seek(AddressFiles, soFromBeginning);

          while AddressFiles <= SizeOriginal-1 do
               begin
                    FOriginal.ReadBuffer(ISimvol,1);
                    FPereveden.ReadBuffer(PSimvol,1);
                    Inc(AddressFiles); // Переменная AddressFiles нужна!

                    // Ищем Нулевые байты в файлах в одинаковой позиции
                    if (ISimvol=0) and (PSimvol=0) then
                         begin
                              // Тут идет код, но сейчас пусто
                         end;
               end;
     finally
          FOriginal.Free;
          FPereveden.Free;

          EndTime := Now;  // Фиксируем время СТОПА
          DelayTime := SecondSpan(EndTime, StartTime); // Вычисляем время выполнения ПРОЦЕДУРЫ

          MainMemo.Lines.Add('Тестовый прогон файлов завершен!' + #13#10 +
                    'Время теста =' + FloatToStr(DelayTime) + ' sec');
     end;
end;


Для тестирования Оба файла заполнялись байтами " FF "
Время выполнения - 36,29 секунды! (Теоретически - используя TFileStream ускорить не получится!)

Используя TBufferedFileStream в этом же коде - получаем 43,68 секунд.

P . S . Время выполнения в пределах одной минуты Полной программы - думаю вполне нормальным, но если кому интересно - можно продолжить и поискать другие варианты, например предложенный SOFT FOR YOU - вариант прочесть оба файла в Memory и уже от туда производить чтение для сравнения!
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575180
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

Читать из памяти предложил не я изначально
Я предложил использовать CachedBuffers

Ни первое, ни второе ты не сделал
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575232
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUНи первое, ни второе ты не сделал
Ну любит человек кактусы, не мешай ему :)
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575249
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOUBellic,

Читать из памяти предложил не я изначально
Я предложил использовать CachedBuffers

Ни первое, ни второе ты не сделал
Ай-яй-яЙ!!!!...

SOFT FOR YOU , подскажи плизз - как установить сие чудо ( CachedBuffers )?
А то автор ни слова о подключении не написал!
Библиотеку скачал, но в папке sources - два файла ( CachedBuffers.pas и CachedStreams.pas )!
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575297
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

Подключаешь в uses CachedBuffers и используешь
А ещё мне кажется, в твоём случае лучше будет такой подход:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
var
  i: Integer;
  B: Byte;
  Reader: TCachedReader;
begin
  Reader := TCachedFileReader.Create(имя файла);
  try
    for i := 0 to Reader.Limit - 1 do 
    begin
      Reader.ReadData(B);
      // ToDo
    end;
  finally
    Reader.Free;
  end;
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575299
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
... скопировал CachedBuffers.pas и CachedStreams.pas в каталог с Проектом и прописал:
Код: pascal
1.
uses CachedBuffers, CachedStreams;


Чем и как можно пользоваться в каждом из модулей?

SOFT FOR YOU , я так понял - это Ваша разработка?
я понял так, что написание Мануала в ней не намечалось!?
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575309
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Reader.Size - не поддерживается !!! (Пытался применить по аналогии с TFileStream-ом)
...
P.S. Напишите пожалуйста подробный мануал по Всем внутренностям Обоих модулей!!!
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575319
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Reader.Seek - аналогично не поддерживается!!!!!!...((((

Ни чего личного!!!
Но Юзер не обязан копаться в исходниках в поиске правильного Синтаксиса и заложенного Функционала!

Имхо!!!
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575334
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

Я же выше написал, как юзать :)
Вместо Size есть Limit. Вместо Seek есть DirectRead. Если хочешь прям вообще Seek - то придётся напрячься. Справка есть в README.md на странице проекта.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575345
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOUBellic, Я же выше написал, как юзать :)
Вместо Size есть Limit. Вместо Seek есть DirectRead. Если хочешь прям вообще Seek - то придётся напрячься. Справка есть в README.md на странице проекта.
Именно Seek - не обязательно!..))
README.md нашел, спасибо!
А на Великом и Могучем, на родненьком (ну по крайней мере, мне!) русском языке - аналог имеется?...)

Уже заюзал..)))
На основе тестовой процедуры, выше, получился следующий код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
procedure TMainForm.TestButtonClick(Sender: TObject);
var
SizeOriginal: Integer;
SizePereveden: Integer;

FROriginal: TCachedReader;
FRPereveden: TCachedReader;

begin
     try
          // Считываем имена файлов из Полей редактирования (возможно редактировались!)
          FullOriginalFileName := FileBinOriginalEdit.Text;   // Эти файлы -
          FullPerevedenFileName := FileBinPerevedenEdit.Text; // уже проверялись
          FullPerevodFileName := DirPerevodEdit.Text + PerevodFileNameEdit.Text;

          FROriginal := TCachedFileReader.Create(FullOriginalFileName);
          FRPereveden := TCachedFileReader.Create(FullPerevedenFileName);
          SizeOriginal := FROriginal.Limit;
          SizePereveden := FRPereveden.Limit;

          if SizeOriginal <> SizePereveden then
               begin
                    ShowMessage('Длины BIN-файлов НЕ РАВНЫ!' + #10#13 +
                         'Продолжение процесса обработки - Невозможно!');
                    Exit;
               end;

          AddressFiles := 0;
          StartTime := Now;        // Фиксируем время Старта

          //===== Встали на Начало в Обоих файлах =====
          //FROriginal.Seek(AddressFiles, soFromBeginning);
          //FRPereveden.Seek(AddressFiles, soFromBeginning);

          while AddressFiles <= SizeOriginal-1 do
               begin
                    FROriginal.ReadData(ISimvol);
                    FRPereveden.ReadData(PSimvol);
                    Inc(AddressFiles);
                    // Ищем совпадение Нулевых байт
                    if (ISimvol=0) and (PSimvol=0) then
                         begin
                              //
                         end;
               end;
     finally
          FROriginal.Free;
          FRPereveden.Free;
          EndTime := Now;  // Фиксируем время СТОПА
          DelayTime := SecondSpan(EndTime, StartTime); // Вычисляем время выполнения ПРОЦЕДУРЫ

          MainMemo.Lines.Add('Тестовый прогон файлов в режиме "CachedBuffers" завершен!' + #13#10 +
                    'Время теста =' + FloatToStr(DelayTime) + ' sec');
     end;
end;

Время выполнения на тех же тестовых файлах - 2,5 секунды !!!!
Афигеть!!! Класс!!!..)))

P.S. SOFT FOR YOU , мне результат очень понравился, хотелось бы изучить более подробней Обе библиотеки, я конечно же прибегну к помощи Google-Переводчика, но Английский язык иногда бывает несколько суховат и не передает некоторые нюансы русскоязычного варианта! Не правда ли?..)))
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575360
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicВремя выполнения на тех же тестовых файлах - 2,5 секунды !!!!
Афигеть!!! Класс!!!..)))Если б ты еще вычитывал и сравнивал не побайтно, а там, по 16к, боюсь представить даже, как бы ты на такую скорость отреагировал. И без кэшедбуферз.
Но, может, так надо, я не вдавался.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575364
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

вот за это
BellicВремя выполнения на тех же тестовых файлах - 2,5 секунды !!!!
Афигеть!!! Класс!!!..)))
ты ему ящик пива шампанского (в преддверии НГ) должен. За рекламу. Если конечно, вы оба двое - разные исторические лица :)
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575369
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

Дока изначально была на русском, а потом переводилась на инглиш. Исходника уже не найти. Можно переводить доки в гугле, можно смотреть демки, можно писать на форум: http://www.sql.ru/forum/1178076-a/oficialnyy-reliz-cachedbuffers
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575375
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

А есть претензия ко мне лично или к моему коду?
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575381
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRockЕсли б ты еще вычитывал и сравнивал не побайтно, а там, по 16к, боюсь представить даже, как бы ты на такую скорость отреагировал. И без кэшедбуферз.
Но, может, так надо, я не вдавался.
Оно и правда там нужно анализировать каждый байт, поэтому по 16К никак не получится!..(

В самом первом посте данного топика я попытался расписать суть настоящей процедуры, а не тестовой, и код там же имеется!
Правда в ней вроде есть одна алгоритмическая ошибка (как я уже исправил ее на сегодняшний момент) и возможно - неточности с анализом выхода за пределы файлов.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575388
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

Самое прикольное, что 2,5 секунды - не предел
ReadData - это высокоуровневая функция. Если научиться работать на низком уровне - можно читать данные напрямую, сейчас кешируется 64Кб. Но это сложно, по крайней мере для твоего уровня, поэтому рекомендую не заморачиваться :)
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575395
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOUBellic,

Дока изначально была на русском, а потом переводилась на инглиш. Исходника уже не найти. Можно переводить доки в гугле, можно смотреть демки, можно писать на форум: http://www.sql.ru/forum/1178076-a/oficialnyy-reliz-cachedbuffers
SOFT FOR YOU , ну а тут можно еще спросить?
Просто чтоб полностью переправить Реальную мою процедуру - нужно еще заменить на Ваши аналоги вот это:
Код: pascal
1.
FilesPos := FOriginal.Position; // FOriginal: TFileStream;

и в обратку:
Код: pascal
1.
FOriginal.Position := FilesPos;


Ну еще раз уточнюсь:
Код: pascal
1.
FROriginal.ReadData(ISimvol);

Автоматически передвигает позицию на следующий байт, как ReadBuffer в TFileStream ?
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575414
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

ReadData сдвигает позицию, да
Позицию в ридере ты так же можешь узнать через свойство Position

Но вот привычного Seek и SetPosition не предусмотрено. Если ты прочитал данные - вернуться назад ты не сможешь. Ты можешь пропустить несколько байт спереди через функцию Skip. Ты можешь прочитать произвольный кусок с помощью функции DirectRead. Например, ты знаешь, что по такому-то смещению есть строка столько то байт. Тогда можешь вызывать DirectRead. Но в общем случае она не быстрее обычного чтения из файла, разве что если этот кусок уже закеширован внутри буфера. И DirectRead не меняет текущую позицию ридера.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575434
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOUBellic,

ReadData сдвигает позицию, да
Позицию в ридере ты так же можешь узнать через свойство Position

Но вот привычного Seek и SetPosition не предусмотрено. Если ты прочитал данные - вернуться назад ты не сможешь. Ты можешь пропустить несколько байт спереди через функцию Skip. Ты можешь прочитать произвольный кусок с помощью функции DirectRead. Например, ты знаешь, что по такому-то смещению есть строка столько то байт. Тогда можешь вызывать DirectRead. Но в общем случае она не быстрее обычного чтения из файла, разве что если этот кусок уже закеширован внутри буфера. И DirectRead не меняет текущую позицию ридера.
В общем то у меня в Реальной процедуре идет побайтное последовательное чтение и сравнение, но лишь до определенного момента, когда сработает одна из проверок.
В этом месте Основная позиция запоминается и начинается чтение и анализ по другому адресу.
После чего может произойти дальнейшее чтение с запомненной Осн.позиции, или же она продвигается вперед на определенное число байт.
Вот такое описание надеюсь понятно?

Не совсем понял - Позицию я установить могу через "свойство Position",
а встать на запомненную ранее - никак???
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575472
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

авторАнглийский язык иногда бывает несколько суховат и не передает некоторые нюансы русскоязычного варианта! Не правда ли?..)))

Если текст писали с хорошим знанием языка, то всё там будет отлично. Ну а на уровне гугло-перевода документации, конечно, будет сухой :)

авторОно и правда там нужно анализировать каждый байт, поэтому по 16К никак не получится.

Что мешает сделать простейший буфер в памяти на 8-16 кб, видимо, так и останется для нас загадкой :)
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575475
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
10 мб можно запросто вычитать целиком в память и там разбираться. Зачем все эти сложности? Ладно был бы хотя бы гиг. И то.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575482
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
господа, ну реально же - 5 строк кода :) ну нафига это всё? вторая неделя разработки! это же ад какой-то :)
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575488
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaon10 мб можно запросто вычитать целиком в память и там разбираться. Зачем все эти сложности? Ладно был бы хотя бы гиг. И то.
Да вот же - хотел с Memory озадачиться, да SOFT FOR YOU начал обижаться на якобы игнор его библиотек..)))
Пощупал, понравилось! - Вот жду уточнения на свои вопросы!

Следующий вариант обязательно будет с Memory !..)))
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575496
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaonгоспода, ну реально же - 5 строк кода :) ну нафига это всё? вторая неделя разработки! это же ад какой-то :)
makhaon , пардон конечно, ...
1 . 5 строк кода - это в Тестовом единственном цикле - ради сравнения!!!
2 . да и никто тут силком никого не держит в этом топике!..)))
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575508
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну не разработчик я!!!..)))
Дэлфи - это мой помощник в моем хобби - локализации японских ( JDM ) магнитол!
Основное время днем - вожу чужих деток в школу, садик, по спорт-комплексам и обратно...
На Дэлфи и JDM наскакиваю урывками, посему порой и некоторая моя "задумчивость" в ответах и решениях!,,))
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575521
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

Прочитать Position можно, установить Position - нельзя
Эта либа предназначается для работы с гигабайтами данных. Ну или хотя бы сотнями мегабайт. А если файлы по 10 метров - конечно, читай их в буфер и обрабатывай целиком
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575546
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicСледующий вариант обязательно будет с Memory !..)))
В своём первом варианте замени файловые стримы на TMemoryStream; Например, так:
Код: pascal
1.
2.
3.
4.
5.
6.
var FOriginal : TMemoryStream;
//
//FOriginal:=TFileStream.Create(FullOriginalFileName, fmOpenRead, fmshareCompat);
//
FOriginal := TMemoryStream.Create;
FOriginal.LoadFromFile(FullOriginalFileName);


...и всё остальное оставь без изменений (будет работать и Seek и Position).
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575563
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOUBellic,

Прочитать Position можно, установить Position - нельзя
Эта либа предназначается для работы с гигабайтами данных. Ну или хотя бы сотнями мегабайт. А если файлы по 10 метров - конечно, читай их в буфер и обрабатывай целиком
Гигов пока не предвидится...))
Сегодня 10 Метров, а завтра может быть уже и поболее! - Всегда удобно иметь под рукой подходящие и проверенные инструменты!))
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575570
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kazantsev Alexey, спасибо!
Я уже на "колесах"...)))
Мемори уже касался чуток вот тут:
http://www.sql.ru/forum/1276254/poisk-i-zamena-posledovatelnosti-bayt-v-binarnom-fayle
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575580
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Да пусть работает с TBytes
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575590
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOUДа пусть работает с TBytes
Мне тоже хотелось бы с ним поэксперементировать, но я еще ни разу с ним не работал!
Это типа файлы в байт-массиве?
Пока к ночи до компа доберусь - можно чуток кода, для затравки?..)))
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575592
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicМемори уже касался чуток вот тут
Я вижу, лёгких путей ты не ищешь :)
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575596
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Kazantsev Alexey]BellicЯ вижу, лёгких путей ты не ищешь :)
Дык легкий путь (ФайлСтрим) в той процедуре вообще 24 часа работал!..)))))
Мемори - решил проблему!
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575632
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUА есть претензия ко мне лично или к моему коду?
помилуй, какие претензии?

мы с тобой в разных полях пасемся :)
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575655
SoftForYou
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bellic,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
function LoadFileData(const FileName: string): TBytes;
var
  F: TFileStream;
  Len: Integer;
begin
  F := TFileStream.Create(FileName, fmRead);
  try
    Len := F.Size;
    SetLength(Result, Len);
    F.ReadBuffer(Pointer(Result)^, Len);
  finally
    F.Free;
  end;
end;
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575675
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читай всё в память!!! Ну правда, так быстрее всего.

Одно решение уже кинули.

Еще:

Код: pascal
1.
Bytes := TFile.ReadAllBytes('1.bin');



У тебя будет массив байт, с которым может сделать что угодно и как угодно :)
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575678
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЭто типа файлы в байт-массиве?

Это массив байт. Кусок памяти, который отображен как n подряд идущих байт. Доступ - как к любому обычному массиву по индексу: arr[i]. И на запись и на чтение. Проще, в общем, некуда :)
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575721
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BellicСледующий вариант обязательно будет с Memory !..)))
Готов вариант на TMemoryStream ...
Вот его код (все та же процедура с одним циклом, чтением и сравнением из двух файлов):
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
procedure TMainForm.TestButtonClick(Sender: TObject);
var
SizeOriginal: Integer;
SizePereveden: Integer;

FMOriginal: TMemoryStream;
FMPereveden: TMemoryStream;

begin
     try
          // Считываем имена файлов из Полей редактирования (возможно редактировались!)
          FullOriginalFileName := FileBinOriginalEdit.Text;   // Эти файлы -
          FullPerevedenFileName := FileBinPerevedenEdit.Text; // уже проверялись
          FullPerevodFileName := DirPerevodEdit.Text + PerevodFileNameEdit.Text;

          FMOriginal := TMemoryStream.Create;
          FMPereveden := TMemoryStream.Create;
          FMOriginal.LoadFromFile(FullOriginalFileName);
          FMPereveden.LoadFromFile(FullPerevedenFileName);
          SizeOriginal := FMOriginal.Size;
          SizePereveden := FMPereveden.Size;

          if SizeOriginal <> SizePereveden then
               begin
                    ShowMessage('Длины BIN-файлов НЕ РАВНЫ!' + #10#13 +
                         'Продолжение процесса обработки - Невозможно!');
                    Exit;
               end;

          AddressFiles := 0;
          StartTime := Now;        // Фиксируем время Старта

          //===== Встали на Начало в Обоих файлах =====
          //FMOriginal.Seek(AddressFiles, soFromBeginning);
          //FMPereveden.Seek(AddressFiles, soFromBeginning);

          while AddressFiles <= SizeOriginal-1 do
               begin
                    FMOriginal.ReadBuffer(ISimvol, 1);
                    FMPereveden.ReadBuffer(PSimvol, 1);
                    Inc(AddressFiles);
                    // Ищем совпадение Нулевых байт
                    if (ISimvol=0) and (PSimvol=0) then
                         begin
                              //
                         end;
               end;
     finally
          FMOriginal.Free;
          FMPereveden.Free;
          EndTime := Now;  // Фиксируем время СТОПА
          DelayTime := SecondSpan(EndTime, StartTime); // Вычисляем время выполнения ПРОЦЕДУРЫ

          MainMemo.Lines.Add('Тестовый прогон файлов в режиме "MemoryStream" завершен!' + #13#10 +
                    'Время теста =' + FloatToStr(DelayTime) + ' sec');
     end;
end;

Полученное время цикла - 2,15 секунды!..)))
Отличный результат, и без доп.библиотек!
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575765
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Очередной вариант на основе TBytes ...
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
procedure TMainForm.TestButtonClick(Sender: TObject);
var
SizeOriginal: Integer;
SizePereveden: Integer;
i: integer;

BOriginal: TBytes;
BPereveden: TBytes;

begin
     try
          // Считываем имена файлов из Полей редактирования (возможно редактировались!)
          FullOriginalFileName := FileBinOriginalEdit.Text;   // Эти файлы -
          FullPerevedenFileName := FileBinPerevedenEdit.Text; // уже проверялись
          FullPerevodFileName := DirPerevodEdit.Text + PerevodFileNameEdit.Text;

          FOriginal := TFileStream.Create(FullOriginalFileName, fmOpenRead, fmShareDenyNone);
          FPereveden := TFileStream.Create(FullPerevedenFileName, fmOpenRead, fmShareDenyNone);
          SizeOriginal := FOriginal.Size;
          SizePereveden := FPereveden.Size;

          if SizeOriginal <> SizePereveden then
               begin
                    ShowMessage('Длины BIN-файлов НЕ РАВНЫ!' + #10#13 +
                         'Продолжение процесса обработки - Невозможно!');
                    Exit;
               end;
          
          // Определяем длину массивов TBytes
          SetLength(BOriginal, SizeOriginal);
          SetLength(BPereveden, SizePereveden);

          // Читаем Оба файла в TBytes
          FOriginal.ReadBuffer(BOriginal, SizeOriginal);
          FPereveden.ReadBuffer(BPereveden, SizePereveden);

          AddressFiles := 0;
          StartTime := Now;        // Фиксируем время Старта

          //===== Встали на Начало в Обоих файлах =====
          i := 0;

          while AddressFiles <= SizeOriginal-1 do
               begin
                    ISimvol := BOriginal[i];
                    PSimvol := BPereveden[i];
                    Inc(i);
                    Inc(AddressFiles);
                    // Ищем совпадение Нулевых байт
                    if (ISimvol=0) and (PSimvol=0) then
                         begin
                              //
                         end;
               end;
     finally
          FOriginal.Free;
          FPereveden.Free;
          EndTime := Now;  // Фиксируем время СТОПА
          DelayTime := SecondSpan(EndTime, StartTime); // Вычисляем время выполнения ПРОЦЕДУРЫ

          MainMemo.Lines.Add('Тестовый прогон файлов в режиме "MemoryStream" завершен!' + #13#10 +
                    'Время теста =' + FloatToStr(DelayTime) + ' sec');
     end;
end;

Полученное время цикла - 0,08 секунды!!!!
Это пожалуй Рекордсмен!..)))
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575788
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic 0,08 секунды!!!!Ну вот, наконец реальное время.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575848
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicПолученное время цикла - 0,08 секунды!!!!
Это пожалуй Рекордсменmmf еще попробуй. к чему эта возня с выделением памяти и чтением файлов
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575924
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavan,

mmf не быстрее
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575973
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vavanmmf еще попробуй. к чему эта возня с выделением памяти и чтением файлов
Ну вот, приплыли!...
Хотел было уже перейти к некоторым "внутренностям" Реальной процедуры, ака например "SStroka := SStroka + AnsiChar(ISimvol);" и прочим, но тут явился vavan и потребовал справедливости!...

Отвечу:
1 . Вот мне кажется именно с " MMF " будет как раз таки больше возни!?
2 . Не совсем этот " MMF " и его Поинтеры мне нравятся, в силу моих слабых знаний!...(

Ну что ж, MMF так MMF... Попробую, но не фак, что справлюсь!
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575974
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUmmf не быстрееесли даже и так то в дидактических целях увлеченному может оказаться интересно
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39575975
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellicтут явился vavan и потребовал справедливостия не настаиваю, прошу прощения
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576005
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vavanя не настаиваю, прошу прощения
Сейчас будешь исправлят!!!..))))))
(Пардон за фамильярность!)
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576008
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicСейчас будешь исправлятне, после меня и то что уже работало перестанет
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576018
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vavanне, после меня и то что уже работало перестанет
Тогда Вы может сами быстрее чем я переделаете Тестовый пример? Код выше имеется!...)))
Зато ломать свое не жалко будет!..)))
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576040
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Парни, подскажите плизз...
Взял за основу следующий код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var file_, map : dword;
    buf: pointer;
begin
  file_ := CreateFile('f:\apm_original.bin', GENERIC_READ, FILE_SHARE_READ,
  nil, OPEN_EXISTING, 0, 0);
  if file_ <> INVALID_HANDLE_VALUE then
    try
      map := CreateFileMapping(file_, nil, PAGE_READWRITE, 0, 0, nil); // В этой строке map=0 !!!
      if map <> 0 then
        try
          buf := MapViewOfFile(map, FILE_MAP_ALL_ACCESS, 0, 0, 0);
          if buf <> nil then
            try

              // now here you have your file1.txt in memory
              // beginning at pointer "buf"

            finally UnmapViewOfFile(buf) end;
        finally CloseHandle(map) end;
    finally CloseHandle(file_) end;
end;

end.

Дальше помеченной строки - не идет, потому как map=0!
Что нужно подправить?
Может еще где ошибки есть тут?
...
Ну и сокровенный вопрос - после Маппинга, каким образом читать байты и передвигать поинтеры?
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576083
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BellicДальше помеченной строки - не идет, потому как map=0!
Что нужно подправить?
В строке:
Код: pascal
1.
map := CreateFileMapping(file_, nil, PAGE_READWRITE, 0, 0, nil);


Заменил параметр PAGE_READWRITE на PAGE_READONLY и map стал ненулевым!
А что - нельзя было оставить???
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576095
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

Просто ты файл открыл ну чтение. Можно рид-райт если есть соответсвующие права на файл
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576124
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

MMF полезен, в частности, если файлы большие, так что их проблематично целиком загрузить в память. Если можно загрузить в память, например файлы размером в несколько десятков мегабайт, то проще и наверное быстрее так и сделать, вот как в варианте с TBytes.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576143
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
s62Bellic,
MMF полезен, в частности, если файлы большие, так что их проблематично целиком загрузить в память. Если можно загрузить в память, например файлы размером в несколько десятков мегабайт, то проще и наверное быстрее так и сделать, вот как в варианте с TBytes.
Парни, погодите чуток!
Поздно уже "пить Боржоми"! - Код почти готов, затыка малюсенькая осталась! Щас курну и побе Ж у ее!..)))
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576162
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПомоЖите... голову сломал уже..(((

Код: pascal
1.
2.
3.
OriginalBuf // Это готовый Поинтер на Мап-файл

PO := PByte(OriginalBuf);

Как теперь считать байт ISimvol по этому Поинтеру, чтоб позже сделать инкремент:
Код: pascal
1.
Inc(PO);

Короче - запутался!!!
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576171
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все!
Разобрался сам...)))
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576176
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mmf быстрее не будет. 10 мб это в современных условиях немного даже на телефоно-планшетах. В целях удобства и простоты, лучше чтением в TBytes и ограничится. Смотри остальное.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576185
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На основе "Memory-Mapped File" получился следующий код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
procedure TMainForm.TestButtonClick(Sender: TObject);
var
SizeOriginal: Integer;
SizePereveden: Integer;

BOriginal: TBytes;
BPereveden: TBytes;

MOriginal, OriginalMap: DWORD;
MPereveden, PerevedenMap: DWORD;
OriginalBuf, PerevedenBuf: Pointer;

pCurrent: Pointer;
PO: PByte;
PP: PByte;

begin
     try
          MainMemo.Lines.Clear;

          // Считываем имена файлов из Полей редактирования (возможно редактировались!)
          FullOriginalFileName := FileBinOriginalEdit.Text;
          FullPerevedenFileName := FileBinPerevedenEdit.Text;
          FullPerevodFileName := DirPerevodEdit.Text + PerevodFileNameEdit.Text;

          FOriginal := TFileStream.Create(FullOriginalFileName, fmOpenRead, fmShareDenyNone);
          FPereveden := TFileStream.Create(FullPerevedenFileName, fmOpenRead, fmShareDenyNone);
          SizeOriginal := FOriginal.Size;
          SizePereveden := FPereveden.Size;

          if SizeOriginal <> SizePereveden then
               begin
                    ShowMessage('Длины BIN-файлов НЕ РАВНЫ!' + #10#13 +
                         'Продолжение процесса обработки - Невозможно!');
                    Exit;
               end;

          MOriginal := CreateFile(pChar(FullOriginalFileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0,0);
          MPereveden := CreateFile(pChar(FullPerevedenFileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0,0);

          if (MOriginal <> INVALID_HANDLE_VALUE) and (MPereveden <> INVALID_HANDLE_VALUE) then
               try
                    OriginalMap := CreateFileMapping(MOriginal, nil, PAGE_READONLY, 0, 0, nil);
                    PerevedenMap := CreateFileMapping(MPereveden, nil, PAGE_READONLY, 0, 0, nil);

                    if (OriginalMap <> 0) and (PerevedenMap <> 0) then
                         try
                              OriginalBuf := MapViewOfFile(OriginalMap, FILE_MAP_READ, 0, 0, 0);
                              PerevedenBuf := MapViewOfFile(PerevedenMap, FILE_MAP_READ, 0, 0, 0);
                              if (OriginalBuf <> nil) and (PerevedenBuf <> nil) then
                                   try
                                        AddressFiles := 0;
                                        StartTime := Now;        // Фиксируем время Старта

                                        PO := PByte(OriginalBuf);
                                        PP := PByte(PerevedenBuf);

                                        while AddressFiles <= SizeOriginal-1 do
                                             begin
                                                  ISimvol := Byte(PO^);
                                                  PSimvol := Byte(PP^);
                                                  Inc(PO);
                                                  Inc(PP);
                                                  Inc(AddressFiles);

                                                  // Ищем совпадение Нулевых байт
                                                  if (ISimvol=0) and (PSimvol=0) then
                                                       begin
                                                            //ProgressBar.Position := AddressFiles;
                                                       end;
                                             end;
                                   finally
                                        UnmapViewOfFile(OriginalBuf);
                                        UnmapViewOfFile(PerevedenBuf);
                                   end;
                         finally
                              CloseHandle(OriginalMap);
                              CloseHandle(PerevedenMap);
                         end;
               finally
                    CloseHandle(MOriginal);
                    CloseHandle(MPereveden);
               end;
     finally
          FOriginal.Free;
          FPereveden.Free;

          EndTime := Now;  // Фиксируем время СТОПА
          DelayTime := SecondSpan(EndTime, StartTime); // Вычисляем время выполнения ПРОЦЕДУРЫ

          MainMemo.Lines.Add('Тестовый прогон файлов в режиме "TBytes" завершен!' + #13#10 +
                    'Время теста =' + FloatToStr(DelayTime) + ' sec');
     end;
end;

Время выполнения все того же Тестового цикла: 0,724 секунды!
Так что MMF не показал достойных результатов к сожалению!
Зато я малость набил руку!...
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576192
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonMmf быстрее не будет. 10 мб это в современных условиях немного даже на телефоно-планшетах. В целях удобства и простоты, лучше чтением в TBytes и ограничится. Смотри остальное.Если это ответ на моё сообщение, то я про это и написал, м.б. не совсем внятно)), что если можно загрузить в память (например если файлы несколько десятков Мб), то проще и (наверное) быстрее так и сделать - загрузить в память.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576220
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Времечко бежит и скоро нужно уже садиться за руль...

Вернусь всеж к одному месту в реальной Процедуре:
Код: pascal
1.
SStroka := SStroka + AnsiChar(ISimvol);

В строковой переменной SStroka происходит таким образом "накопление" нужных мне данных.

Конкатенация тут мне полезна по двум причинам:

1 . Не надо следить за указателем.
2 . Строка - есть Массив и к тому же - "безразмерный"!

Вторая причина - пожалуй самая главная ! - Нет необходимости объявлять размер заранее!

P.S. Думаю мои эксперименты будут полезны не только мне как получение опыта, но и другим новичкам, кто позже найдет эту тему!?
Всем, огромное спасибо! - В том числе и за "молчание", позволившее самому до всего "допетрить"!...
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576280
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bellic... Время выполнения все того же Тестового цикла: 0,724 секунды!
Так что MMF не показал достойных результатов к сожалению!
Принципиальное отличие между MMF и варианта на основе TBytes в следующих строках:
Код: pascal
1.
2.
3.
// Читаем Оба файла в TBytes
 FOriginal.ReadBuffer(BOriginal, SizeOriginal);
 FPereveden.ReadBuffer(BPereveden, SizePereveden);

Обработка цикла TBytes производится только в памяти, а цикл в MMF - буферизированное чтение с диска. Буферезацией занимается Windows. Так что сравнение не совсем корректное.
BellicВернусь всеж к одному месту в реальной Процедуре:
Код: pascal
1.
SStroka := SStroka + AnsiChar(ISimvol);

В строковой переменной SStroka происходит таким образом "накопление" нужных мне данных.При большом объеме даных и частом вызове есть вероятность фрагментации памяти. Для уменьшения фрагментации можно использовать массив по аналогии с TList.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576323
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Freedoom, тут было сравнение времени для использования в реальной процедуре, а не чисто дле теории!
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576386
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bellic, побайтовое чтение с диска будет намного медленнее, чем чтение блоком всего файла. Это очевидный факт, на мой взгляд, не требующий таких вариантов проверки.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576398
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

Попробуй ещё побитовое чтение.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576448
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чччДBellic,
Попробуй ещё побитовое чтение.Невероятно остроумно!..)))
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576558
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicчччДBellic,
Попробуй ещё побитовое чтение.Невероятно остроумно!..)))
Если организовать флэшмоб с криком "давайте предложим еще более скоростной способ сравнения бинарников, пока я принимаю пищу/отхожу ко сну/занимаюсь сексом (нужное подчеркнуть)", предложения будет еще остромнее. Это к тому, что во всем желательно меру соблюдать
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576575
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

Просто оптимизации не для всех
Кто-то может, кто-то нет
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576600
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Вот вот. Поэтому нужно CachedBuffers выкинуть и сделать быстро и просто одной строкой кода :)
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576602
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЭто самый быстрый способ побайтного чтения твоих файлов

Вместо того, что бы сделать как нужно - читать всё и сразу - предлагаешь новичку фигню. А он ведётся.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576617
Василий №2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BellicНа основе "Memory-Mapped File" получился следующий код:
Очень много ненужных try-finally, они даже в RTL коде не нужны в таком количестве, а при работе с Winapi, где исключений не может всплыть по определению (ну кроме совсем запущенных случаев) они вообще избыточны.
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39576708
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Василий №2Очень много ненужных try-finally, они даже в RTL коде не нужны в таком количестве, а при работе с Winapi, где исключений не может всплыть по определению (ну кроме совсем запущенных случаев) они вообще избыточны.А вы напишите свой вариант, не стесняйтесь!..)))
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39577066
Василий №2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BellicА вы напишите свой вариант, не стесняйтесь!..)))
Я просто советую, на будущее
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39577075
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

Ну так кто же знал, что у него файлы крохотные будут )
Я человек простой - вижу стримы - шлю на CachedBuffers)

Кстати судя по тестам вариант с CachedBuffers может быть быстрее TBytes-варианта. Потому что пока прочитанный кусок памяти обрабатывается, последующий может подготовадиваьься для чтения файловой системой - такая особенность последовательной обработки файлов. Кроме того 64Кб буфер всегда будет в кеше, а для 10Мб будет постоянный кешмисс. Но в этом случае придётся отказаться от высокоуровневой ReadData и обращаться напрямую к прочитанному буферу. Но в этом случае код усложнится до уровня, невоспроизводимого топик стартером ближайшие 10 лет )
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39577080
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU...Кстати судя по тестам вариант с CachedBuffers может быть быстрее TBytes-варианта...
Пока по тестам видно, что твои буферы отработали медленнее в 30 раз.
Разве что буферам специальные тесты нужны...
...
Рейтинг: 0 / 0
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #39577100
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД,

Просто ты не внимательно читал
Он сказал, скорость прохода цикла, а не скорость считывания данных из файла :)
...
Рейтинг: 0 / 0
112 сообщений из 112, показаны все 5 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Оптимизация побайтового чтения и сравнения двух бинарных файлов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]