powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Оптимизация побайтового чтения и сравнения двух бинарных файлов
25 сообщений из 112, страница 2 из 5
Оптимизация побайтового чтения и сравнения двух бинарных файлов
    #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
25 сообщений из 112, страница 2 из 5
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Оптимизация побайтового чтения и сравнения двух бинарных файлов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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