|
|
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Прошу знатоков помочь с оптимизацией побайтового чтения и сравнения двух бинарных файлов! Ниже приведен несколько урезанный код самой процедуры... (прошу не пинать за возможно большой код... но иначе возможно было бы больше от Вас уточнений и ухода темы в сторону) Данная тема перекликается с моей же темой " Вывод в Memo японских иероглифов (932-я кодовая таблица) ", но об этом позже. Немного словесного описания: Процедура оперирует двумя бинарными файлами одинаковой длины: - OriginalFile - бинарный файл в котором встречаются английские и японские текстовые фразы (в 932 или 20932 -й кодировке) с лидирующими и замыкающими нулевыми байтами; - PerevedenFile - бин.файл созданный на основе предыдущего Оригинала, но японские фразы заменены на их английские аналоги, т.е. Переведены с учетом длины японской фразы включая Пред.и После-нули. Данный файл может быть "переведен" предварительно вручную или др.программой, это не важно! Задача процедуры - на основании информации из файлов OriginalFile и PerevedenFile сформировать текстовый файл PerevodFile со структурой, упрощенно похожей на XML, который можно будет открывать для просмотра в текстовом редакторе (в дальнейшем буду иметь ввиду " Notepad++ "), так и в "WinHex". Пришло время привести тестовые примеры этих Трех файлов, а затем - структуру выходного файла PerevodFile !? OriginalFile : PerevedenFile : PerevodFile : Но лучше на него взглянуть из " Notepad++ " (включена индикация "Всех" символов): Эхх - картинка длинная получилась!..((( Надеюсь на 14'-вом монике никто не читает?..) Или можно скопировать его сюда: Код: xml 1. 2. Правда упр.символов " 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. Для побайтного-посимвольного накопления выходного файла я использовал TMemo с последующей процедурой удаления дублей строк (ее текст тут упущен..) и выгрузкой его в файл. Хотя наверное для этого можно использовать и TStringList !? - Надо попробовать его. Формат получаемого файла " Perevod " полностью меня устраивает, единственное, что никак не могу понять: MainMemo : При выводе в TMemo всего этого "bla-bla-bla...", вместо японских иероглифов присутствую совсем другие символы! (А в свойствах TMemo.Font зачем тогда присутствует выбор кодировки, в том числе 932 !? ) НО!!! - Вопрос по TMemo.Font - это совсем другая история и я уже начал по ней дискуссию ТАМ . P.S. В данном топике меня интересует прежде всего - варианты оптимизации чтения! (Ну а дальше - что позволят уважаемые Модераторы...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2017, 15:11 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
BellicПодскажите пожалуйста, для реализации данного алгоритма - какие варианты можно еще попробовать??? Можно начать отсюда https://www.google.com/search?q=delphi buffered file stream ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2017, 15:41 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellic(Ну а дальше - что позволят уважаемые Модераторы...) Модератор настоятельно советует не злоупотреблять оформлением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2017, 16:07 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellic, Я нифига не понял, чего тебе нужно. Изложи вопрос компактнее, пожалуйста От себя замечу, что UniConv поддерживает 932 и 20932 кодировки. А значит и CachedTexts поддерживает их. Значит ты можешь делать построчные Readln и вообще как угодно работать с текстом. Хоть через автокоррекцию в UTF8, хоть в Unicode, хоть в 51949 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2017, 18:52 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2017, 21:24 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUUniConv поддерживает 932 и 20932 кодировки. А значит и CachedTexts поддерживает их. дальше все про блох.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2017, 21:55 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2017, 10:28 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
BellicДля побайтного-посимвольного накопления выходного файла я использовал TMemo Bellic... выдала офигительный результат - вместо 2491 msec, тест сработал за 31 msec (это более чем в 80 раз быстрее!) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2017, 11:08 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Глянул на исходники... Я уже писал вам в другой теме, что код вида Код: pascal 1. 2. 3. 4. 5. 6. и слово "скорость", взаимосвязаны примерно как гиппопотам и стратосферные полёты. Ради интереса, запустите своё приложение в режиме отладчика (с включенной опцией Use Debug DCUs ) и пройдитесь кнопкой F7 (Trace Into) по этому циклу, посмотрите сколько и какого кода там выполняется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2017, 11:35 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
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. Чё-то не понял, у тебя же файл японский, а не юникодовый. Почему ты читаешь Char? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2017, 12:07 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
И какой вообще смысл читать посимвольно файл? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2017, 12:09 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. А потом читаешь построчно: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. А посимвольно можно так. Для Char (WideChar) можно сделать быстрее, только расписывать не буду :) Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2017, 12:34 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
alekcvpГлянул на исходники... Я уже писал вам в другой теме, что код вида Код: pascal 1. 2. 3. 4. 5. 6. и слово "скорость", взаимосвязаны примерно как гиппопотам и стратосферные полёты. Ради интереса, запустите своё приложение в режиме отладчика (с включенной опцией Use Debug DCUs ) и пройдитесь кнопкой F7 (Trace Into) по этому циклу, посмотрите сколько и какого кода там выполняется. Рано я обрадовался!!! Замена TFileStream на TBufferedFileStream в реальной процедуре скорости ей не прибавила, и даже наоборот (было 193 сек, а стало - 196 сек)! И с Вам, alekcvp , я тоже полностью согласен, что вышеуказанный цикл "гиппопотамовский"! Индикация в Memo в принципе вообще не нужна, а произвести формирование Выходного файла думаю можно и в TStringList , а потом командой SaveToFile сохранить его в файле!? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2017, 12:38 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
SoftForYouЧё-то не понял, у тебя же файл японский, а не юникодовый. Почему ты читаешь Char? Вообще то читаю и анализирую побайтно (ISimvol, PSimvol: Byte;) потому, что в Исходных файлах могут быть не только 2-х байтные, но и 1-байтные японские символы (932 и 20932-й кодировок), латиница, а так же просто например машинный код для процессора! SoftForYou , я ответил на Ваш вопрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2017, 12:47 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
SoftForYouИ какой вообще смысл читать посимвольно файл? Исходные файлы OriginalFile и PerevedenFile - это Бинарники, а не Текстовые! Это вообще-то "прошивки" для электронных устройств (машинный код!) с некоторым числом Текстовых фраз! По другому тут я думаю никак не получится! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2017, 12:52 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellicэто Бинарники, а не Текстовые!Bellic, методичку по массивам почитай )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2017, 14:38 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellic, Тогда тебе нужен CachedBuffers По сути тебе нужен только CachedBuffers.pas Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Это самый быстрый способ побайтного чтения твоих файлов Но я думаю, скорость у тебя проседает не на чтении файлов, а в каких-то других местах, например, при переводе строки в юникод ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2017, 14:57 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Попкорновый файлBellicэто Бинарники, а не Текстовые!Bellic, методичку по массивам почитай )) На предмет чего? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2017, 16:43 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Думал насчет использования массивов, но пока решил повременить... В общем отказался от TMemo для "формирования и накопления" строк и последующего сохранения его в файл... (Вывод в TMemo оставил только для информационных сообщений) Чтение бинарников оставил через TFileStream . Сейчас это выглядит примерно так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. В результате - время выполнения процедуры от 193 секунд уменьшилось до 87 ! (Забыл ранее упомянуть, что размер бинарников - каждый примерно по 10 Мбайт ) В принципе - результатом более или менее доволен, но думаю что можно еще подчистит код или попробовать другие варианты реализации, в том числе и с Массивами! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2017, 01:16 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellic(Забыл ранее упомянуть, что размер бинарников - каждый примерно по 10 Мбайт ) Копейки... Можно разом загрузить и не дергать чтение по байтам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2017, 09:13 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
BellicСейчас это выглядит примерно так: Код: pascal 1. 2. 3. 4. 1. При последовательном чтении Seek() делать не надо, Read[Buffer]() сама переносит указатель на Count позиций вперёд. 2. Для разнообразия: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2017, 10:53 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellic, Загрузи исходные файлы в память, так будет быстрее и удобнее А запись в файл у тебя очень долгая - ты постоянно перевыделяешь строки и используешь конкатенацию. Тебе нужно использовать TCachedTextWriter и TTemporaryString. В общем не очень ясно, зачем ты у нас что-то спрашиваешь, если вообще не прислушиваешься к тому, что мы говорим :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2017, 11:48 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
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. ; SOFT FOR YOUЗагрузи исходные файлы в память, так будет быстрее и удобнееОтличная идея!!! Следующий вариант попробую именно его! А запись в файл у тебя очень долгая - ты постоянно перевыделяешь строки и используешь конкатенацию.Конкатенацию юзать удобно - не надо следить за указателем позиции. А запись в файл в свете варианта использования " TStringList ", выглядит одной строкой: Код: pascal 1. Тебе нужно использовать TCachedTextWriter и TTemporaryString. В общем не очень ясно, зачем ты у нас что-то спрашиваешь, если вообще не прислушиваешься к тому, что мы говорим :) SOFT FOR YOU , я думаю Вы зря обвиняете меня в невнимательности к предложениям пользователей! Замену TFileStream на TBufferedFileStream попробовал; От TMemo с позицированием в нем (типа " Memo.Lines[Memo.Lines.Count-1]:=Memo.Lines[Memo.Lines.Count-1] + '#'; ") тоже избавился. Массив частично заюзал - " SStroka: AnsiString; " - это же по сути тот же массив, но символьный!? ...при возможности - обязательно попробую предложенные Вами варианты... P . S . К сожалению (или к счастью?!) мы все люди (как ни странно...), а не машины! У каждого свои достоинства, недостатки и Время - для их приумножения или искоренения!... Спасибо Всем, за то что Вы сейчас со мной, здесь и сейчас!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2017, 13:23 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellic, >Конкатенацию юзать удобно - не надо следить за указателем позиции. Удобно, но медленно. Указатель - всего лишь одна переменная + 1-2 строки кода. Многократное ускорение стоят того, что бы разобраться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2017, 16:48 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
makhaonBellic, >Конкатенацию юзать удобно - не надо следить за указателем позиции. Удобно, но медленно. Указатель - всего лишь одна переменная + 1-2 строки кода. Многократное ускорение стоят того, что бы разобраться. Ну я не стою на месте... Правда неудачно "выкосил" Seek , в результате чего сломался алгоритм и в выходном файле появились ошибочные данные...(( Будет время - пройдусь пошагово на тестовых файлах... А уже после этого - буду думать что еще можно оптимизировать! Хотелось бы дорешать этот вариант! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2017, 17:37 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellic, Не, ну я здесь как бы самый главный специалист по оптимизациям и тексту А ты меня игнорируешь. Мне обидно Что до компонента - это открытие библиотеки на гитхабе. Ссылку я тебе дал, а если что - достаточно легко гуглится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2017, 18:56 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
BellicА уже после этого - буду думать что еще можно оптимизировать! Не слушай прематурщиков. На избавлении от конкатенации ты много не сэкономишь. В современных дельфях очень хороший менеджер памяти (FastMM), которому многократные запросы на ресайз не страшны. Вот на избавлении от множества дисковых операций сэкономить можно, да. Кроме этого, у тебя есть ещё один косяк, который может изрядно тормозить. Замени свою AnsiString на UnicodeString или просто на String, и посмотри, что будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2017, 19:00 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUНе, ну я здесь как бы самый главный специалист по оптимизациям и тексту ...самопровозглашённый ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2017, 19:02 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey...самопровозглашённый ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2017, 19:06 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, померял на xe6 - разница в 10 раз, конкатенация против заполнения. хотя, конечно, на современных процессорах возможно и незаметно особо будет на небольших наборах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2017, 19:56 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
makhaonпомерял на xe6 - разница в 10 раз Ты померял конкатенацию в вакуме. Я тоже померял. Взял 10 мегабайт, и конкатенацией, побайтово, присовокупил к строке (s := s + IntToHex(b, 2)). Заняло это действо... 500msec. Аж целых пол-секунды. У топикстартера задача длится больше минуты. Ну и какая ему радость, от того, что усложнением кода удастся уменьшить 500msec до 50? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2017, 20:11 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, понятно, что основные тормоза там на дисковых операциях. однако и это место можно вполне улучшить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2017, 20:17 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
makhaonпонятно, что основные тормоза там на дисковых операциях Вот тоже не факт. Дисковый кеш тоже не просто так существует. makhaonоднако и это место можно вполне улучшить. Нечего там экономить. У него больше потерь на конвертировании UnicodeString <> AnsiString происходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2017, 20:31 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, побайтное чтение - тоже не сахар. сложно сказать, что тормозит больше. есть куда оптимизировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2017, 21:27 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, Конкатенация это не ресайз Здесь вообще кроме дисковых операций, работы с памятью и конвертации - ничего нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2017, 21:39 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
makhaonпобайтное чтение - тоже не сахар. И именно поэтому экономить на конкатенации в данном случае - прематурщина. SOFT FOR YOUКонкатенация это не ресайз Многократный запрос на ресайз это то, чем отличается конкатенация в цикле от варианта с предварительным резервированием. SOFT FOR YOUЗдесь вообще кроме дисковых операций, работы с памятью и конвертации - ничего нет Ты вообще-то говорил, что тут строки постоянно перевыделяются. А они таки нет. Вот то что они постоянно конвертируются, это таки да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2017, 22:35 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, Если я ничего не путаю То в данном коде выделяется 2 новые строки Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2017, 22:46 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, На первой итерации цикла. Потом одна строка (т.е. память под неё) постепенно ресайзится, а вторая остаётся неизменной до конца цикла (т.к. многие функции возращающие строки не инициализируют результат, а просто изменяют размер. Ну а если размер постоянный...). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2017, 22:51 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
В общем - еще раз провел "ревизию" алгоритма, убрав "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. Для тестирования Оба файла заполнялись байтами " FF " Время выполнения - 36,29 секунды! (Теоретически - используя TFileStream ускорить не получится!) Используя TBufferedFileStream в этом же коде - получаем 43,68 секунд. P . S . Время выполнения в пределах одной минуты Полной программы - думаю вполне нормальным, но если кому интересно - можно продолжить и поискать другие варианты, например предложенный SOFT FOR YOU - вариант прочесть оба файла в Memory и уже от туда производить чтение для сравнения! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 01:09 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellic, Читать из памяти предложил не я изначально Я предложил использовать CachedBuffers Ни первое, ни второе ты не сделал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 09:15 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUНи первое, ни второе ты не сделал Ну любит человек кактусы, не мешай ему :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 10:25 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUBellic, Читать из памяти предложил не я изначально Я предложил использовать CachedBuffers Ни первое, ни второе ты не сделал Ай-яй-яЙ!!!!... SOFT FOR YOU , подскажи плизз - как установить сие чудо ( CachedBuffers )? А то автор ни слова о подключении не написал! Библиотеку скачал, но в папке sources - два файла ( CachedBuffers.pas и CachedStreams.pas )! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 10:43 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellic, Подключаешь в uses CachedBuffers и используешь А ещё мне кажется, в твоём случае лучше будет такой подход: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 11:51 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
... скопировал CachedBuffers.pas и CachedStreams.pas в каталог с Проектом и прописал: Код: pascal 1. Чем и как можно пользоваться в каждом из модулей? SOFT FOR YOU , я так понял - это Ваша разработка? я понял так, что написание Мануала в ней не намечалось!? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 11:56 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Reader.Size - не поддерживается !!! (Пытался применить по аналогии с TFileStream-ом) ... P.S. Напишите пожалуйста подробный мануал по Всем внутренностям Обоих модулей!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 12:08 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Reader.Seek - аналогично не поддерживается!!!!!!...(((( Ни чего личного!!! Но Юзер не обязан копаться в исходниках в поиске правильного Синтаксиса и заложенного Функционала! Имхо!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 12:18 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellic, Я же выше написал, как юзать :) Вместо Size есть Limit. Вместо Seek есть DirectRead. Если хочешь прям вообще Seek - то придётся напрячься. Справка есть в README.md на странице проекта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 12:35 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
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. Афигеть!!! Класс!!!..))) P.S. SOFT FOR YOU , мне результат очень понравился, хотелось бы изучить более подробней Обе библиотеки, я конечно же прибегну к помощи Google-Переводчика, но Английский язык иногда бывает несколько суховат и не передает некоторые нюансы русскоязычного варианта! Не правда ли?..))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 12:50 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
BellicВремя выполнения на тех же тестовых файлах - 2,5 секунды !!!! Афигеть!!! Класс!!!..)))Если б ты еще вычитывал и сравнивал не побайтно, а там, по 16к, боюсь представить даже, как бы ты на такую скорость отреагировал. И без кэшедбуферз. Но, может, так надо, я не вдавался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 13:14 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, вот за это BellicВремя выполнения на тех же тестовых файлах - 2,5 секунды !!!! Афигеть!!! Класс!!!..))) ты ему ящик пива шампанского (в преддверии НГ) должен. За рекламу. Если конечно, вы оба двое - разные исторические лица :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 13:15 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellic, Дока изначально была на русском, а потом переводилась на инглиш. Исходника уже не найти. Можно переводить доки в гугле, можно смотреть демки, можно писать на форум: http://www.sql.ru/forum/1178076-a/oficialnyy-reliz-cachedbuffers ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 13:19 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Док, А есть претензия ко мне лично или к моему коду? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 13:22 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
YuRockЕсли б ты еще вычитывал и сравнивал не побайтно, а там, по 16к, боюсь представить даже, как бы ты на такую скорость отреагировал. И без кэшедбуферз. Но, может, так надо, я не вдавался. Оно и правда там нужно анализировать каждый байт, поэтому по 16К никак не получится!..( В самом первом посте данного топика я попытался расписать суть настоящей процедуры, а не тестовой, и код там же имеется! Правда в ней вроде есть одна алгоритмическая ошибка (как я уже исправил ее на сегодняшний момент) и возможно - неточности с анализом выхода за пределы файлов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 13:27 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellic, Самое прикольное, что 2,5 секунды - не предел ReadData - это высокоуровневая функция. Если научиться работать на низком уровне - можно читать данные напрямую, сейчас кешируется 64Кб. Но это сложно, по крайней мере для твоего уровня, поэтому рекомендую не заморачиваться :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 13:32 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUBellic, Дока изначально была на русском, а потом переводилась на инглиш. Исходника уже не найти. Можно переводить доки в гугле, можно смотреть демки, можно писать на форум: http://www.sql.ru/forum/1178076-a/oficialnyy-reliz-cachedbuffers SOFT FOR YOU , ну а тут можно еще спросить? Просто чтоб полностью переправить Реальную мою процедуру - нужно еще заменить на Ваши аналоги вот это: Код: pascal 1. и в обратку: Код: pascal 1. Ну еще раз уточнюсь: Код: pascal 1. Автоматически передвигает позицию на следующий байт, как ReadBuffer в TFileStream ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 13:37 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellic, ReadData сдвигает позицию, да Позицию в ридере ты так же можешь узнать через свойство Position Но вот привычного Seek и SetPosition не предусмотрено. Если ты прочитал данные - вернуться назад ты не сможешь. Ты можешь пропустить несколько байт спереди через функцию Skip. Ты можешь прочитать произвольный кусок с помощью функции DirectRead. Например, ты знаешь, что по такому-то смещению есть строка столько то байт. Тогда можешь вызывать DirectRead. Но в общем случае она не быстрее обычного чтения из файла, разве что если этот кусок уже закеширован внутри буфера. И DirectRead не меняет текущую позицию ридера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 13:52 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUBellic, ReadData сдвигает позицию, да Позицию в ридере ты так же можешь узнать через свойство Position Но вот привычного Seek и SetPosition не предусмотрено. Если ты прочитал данные - вернуться назад ты не сможешь. Ты можешь пропустить несколько байт спереди через функцию Skip. Ты можешь прочитать произвольный кусок с помощью функции DirectRead. Например, ты знаешь, что по такому-то смещению есть строка столько то байт. Тогда можешь вызывать DirectRead. Но в общем случае она не быстрее обычного чтения из файла, разве что если этот кусок уже закеширован внутри буфера. И DirectRead не меняет текущую позицию ридера. В общем то у меня в Реальной процедуре идет побайтное последовательное чтение и сравнение, но лишь до определенного момента, когда сработает одна из проверок. В этом месте Основная позиция запоминается и начинается чтение и анализ по другому адресу. После чего может произойти дальнейшее чтение с запомненной Осн.позиции, или же она продвигается вперед на определенное число байт. Вот такое описание надеюсь понятно? Не совсем понял - Позицию я установить могу через "свойство Position", а встать на запомненную ранее - никак??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 14:08 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellic, авторАнглийский язык иногда бывает несколько суховат и не передает некоторые нюансы русскоязычного варианта! Не правда ли?..))) Если текст писали с хорошим знанием языка, то всё там будет отлично. Ну а на уровне гугло-перевода документации, конечно, будет сухой :) авторОно и правда там нужно анализировать каждый байт, поэтому по 16К никак не получится. Что мешает сделать простейший буфер в памяти на 8-16 кб, видимо, так и останется для нас загадкой :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 14:27 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
10 мб можно запросто вычитать целиком в память и там разбираться. Зачем все эти сложности? Ладно был бы хотя бы гиг. И то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 14:28 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
господа, ну реально же - 5 строк кода :) ну нафига это всё? вторая неделя разработки! это же ад какой-то :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 14:32 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
makhaon10 мб можно запросто вычитать целиком в память и там разбираться. Зачем все эти сложности? Ладно был бы хотя бы гиг. И то. Да вот же - хотел с Memory озадачиться, да SOFT FOR YOU начал обижаться на якобы игнор его библиотек..))) Пощупал, понравилось! - Вот жду уточнения на свои вопросы! Следующий вариант обязательно будет с Memory !..))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 14:34 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
makhaonгоспода, ну реально же - 5 строк кода :) ну нафига это всё? вторая неделя разработки! это же ад какой-то :) makhaon , пардон конечно, ... 1 . 5 строк кода - это в Тестовом единственном цикле - ради сравнения!!! 2 . да и никто тут силком никого не держит в этом топике!..))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 14:37 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Ну не разработчик я!!!..))) Дэлфи - это мой помощник в моем хобби - локализации японских ( JDM ) магнитол! Основное время днем - вожу чужих деток в школу, садик, по спорт-комплексам и обратно... На Дэлфи и JDM наскакиваю урывками, посему порой и некоторая моя "задумчивость" в ответах и решениях!,,)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 14:46 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellic, Прочитать Position можно, установить Position - нельзя Эта либа предназначается для работы с гигабайтами данных. Ну или хотя бы сотнями мегабайт. А если файлы по 10 метров - конечно, читай их в буфер и обрабатывай целиком ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 14:55 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
BellicСледующий вариант обязательно будет с Memory !..))) В своём первом варианте замени файловые стримы на TMemoryStream; Например, так: Код: pascal 1. 2. 3. 4. 5. 6. ...и всё остальное оставь без изменений (будет работать и Seek и Position). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 15:28 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUBellic, Прочитать Position можно, установить Position - нельзя Эта либа предназначается для работы с гигабайтами данных. Ну или хотя бы сотнями мегабайт. А если файлы по 10 метров - конечно, читай их в буфер и обрабатывай целиком Гигов пока не предвидится...)) Сегодня 10 Метров, а завтра может быть уже и поболее! - Всегда удобно иметь под рукой подходящие и проверенные инструменты!)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 15:45 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, спасибо! Я уже на "колесах"...))) Мемори уже касался чуток вот тут: http://www.sql.ru/forum/1276254/poisk-i-zamena-posledovatelnosti-bayt-v-binarnom-fayle ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 15:51 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, Да пусть работает с TBytes ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 16:00 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUДа пусть работает с TBytes Мне тоже хотелось бы с ним поэксперементировать, но я еще ни разу с ним не работал! Это типа файлы в байт-массиве? Пока к ночи до компа доберусь - можно чуток кода, для затравки?..))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 16:17 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
BellicМемори уже касался чуток вот тут Я вижу, лёгких путей ты не ищешь :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 16:19 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
[quot Kazantsev Alexey]BellicЯ вижу, лёгких путей ты не ищешь :) Дык легкий путь (ФайлСтрим) в той процедуре вообще 24 часа работал!..))))) Мемори - решил проблему! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 16:23 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUА есть претензия ко мне лично или к моему коду? помилуй, какие претензии? мы с тобой в разных полях пасемся :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 17:31 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellic, Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 18:25 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Читай всё в память!!! Ну правда, так быстрее всего. Одно решение уже кинули. Еще: Код: pascal 1. У тебя будет массив байт, с которым может сделать что угодно и как угодно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 19:16 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
авторЭто типа файлы в байт-массиве? Это массив байт. Кусок памяти, который отображен как n подряд идущих байт. Доступ - как к любому обычному массиву по индексу: arr[i]. И на запись и на чтение. Проще, в общем, некуда :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 19:21 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
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. Отличный результат, и без доп.библиотек! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2017, 21:46 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Очередной вариант на основе 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. Это пожалуй Рекордсмен!..))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 00:15 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellic 0,08 секунды!!!!Ну вот, наконец реальное время. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 05:38 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
BellicПолученное время цикла - 0,08 секунды!!!! Это пожалуй Рекордсменmmf еще попробуй. к чему эта возня с выделением памяти и чтением файлов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 09:17 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
vavan, mmf не быстрее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 11:07 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
vavanmmf еще попробуй. к чему эта возня с выделением памяти и чтением файлов Ну вот, приплыли!... Хотел было уже перейти к некоторым "внутренностям" Реальной процедуры, ака например "SStroka := SStroka + AnsiChar(ISimvol);" и прочим, но тут явился vavan и потребовал справедливости!... Отвечу: 1 . Вот мне кажется именно с " MMF " будет как раз таки больше возни!? 2 . Не совсем этот " MMF " и его Поинтеры мне нравятся, в силу моих слабых знаний!...( Ну что ж, MMF так MMF... Попробую, но не фак, что справлюсь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 11:49 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUmmf не быстрееесли даже и так то в дидактических целях увлеченному может оказаться интересно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 11:49 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellicтут явился vavan и потребовал справедливостия не настаиваю, прошу прощения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 11:50 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
vavanя не настаиваю, прошу прощения Сейчас будешь исправлят!!!..)))))) (Пардон за фамильярность!) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 12:18 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
BellicСейчас будешь исправлятне, после меня и то что уже работало перестанет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 12:21 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
vavanне, после меня и то что уже работало перестанет Тогда Вы может сами быстрее чем я переделаете Тестовый пример? Код выше имеется!...))) Зато ломать свое не жалко будет!..))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 12:35 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Парни, подскажите плизз... Взял за основу следующий код: Код: 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. Дальше помеченной строки - не идет, потому как map=0! Что нужно подправить? Может еще где ошибки есть тут? ... Ну и сокровенный вопрос - после Маппинга, каким образом читать байты и передвигать поинтеры? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 13:02 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
BellicДальше помеченной строки - не идет, потому как map=0! Что нужно подправить? В строке: Код: pascal 1. Заменил параметр PAGE_READWRITE на PAGE_READONLY и map стал ненулевым! А что - нельзя было оставить??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 13:42 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellic, Просто ты файл открыл ну чтение. Можно рид-райт если есть соответсвующие права на файл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 13:53 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellic, MMF полезен, в частности, если файлы большие, так что их проблематично целиком загрузить в память. Если можно загрузить в память, например файлы размером в несколько десятков мегабайт, то проще и наверное быстрее так и сделать, вот как в варианте с TBytes. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 14:16 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
s62Bellic, MMF полезен, в частности, если файлы большие, так что их проблематично целиком загрузить в память. Если можно загрузить в память, например файлы размером в несколько десятков мегабайт, то проще и наверное быстрее так и сделать, вот как в варианте с TBytes. Парни, погодите чуток! Поздно уже "пить Боржоми"! - Код почти готов, затыка малюсенькая осталась! Щас курну и побе Ж у ее!..))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 14:27 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
ПомоЖите... голову сломал уже..((( Код: pascal 1. 2. 3. Как теперь считать байт ISimvol по этому Поинтеру, чтоб позже сделать инкремент: Код: pascal 1. Короче - запутался!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 14:51 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Все! Разобрался сам...))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 15:03 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Mmf быстрее не будет. 10 мб это в современных условиях немного даже на телефоно-планшетах. В целях удобства и простоты, лучше чтением в TBytes и ограничится. Смотри остальное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 15:07 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
На основе "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. Так что MMF не показал достойных результатов к сожалению! Зато я малость набил руку!... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 15:12 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
makhaonMmf быстрее не будет. 10 мб это в современных условиях немного даже на телефоно-планшетах. В целях удобства и простоты, лучше чтением в TBytes и ограничится. Смотри остальное.Если это ответ на моё сообщение, то я про это и написал, м.б. не совсем внятно)), что если можно загрузить в память (например если файлы несколько десятков Мб), то проще и (наверное) быстрее так и сделать - загрузить в память. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 15:17 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Времечко бежит и скоро нужно уже садиться за руль... Вернусь всеж к одному месту в реальной Процедуре: Код: pascal 1. В строковой переменной SStroka происходит таким образом "накопление" нужных мне данных. Конкатенация тут мне полезна по двум причинам: 1 . Не надо следить за указателем. 2 . Строка - есть Массив и к тому же - "безразмерный"! Вторая причина - пожалуй самая главная ! - Нет необходимости объявлять размер заранее! P.S. Думаю мои эксперименты будут полезны не только мне как получение опыта, но и другим новичкам, кто позже найдет эту тему!? Всем, огромное спасибо! - В том числе и за "молчание", позволившее самому до всего "допетрить"!... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 15:47 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellic... Время выполнения все того же Тестового цикла: 0,724 секунды! Так что MMF не показал достойных результатов к сожалению! Принципиальное отличие между MMF и варианта на основе TBytes в следующих строках: Код: pascal 1. 2. 3. Обработка цикла TBytes производится только в памяти, а цикл в MMF - буферизированное чтение с диска. Буферезацией занимается Windows. Так что сравнение не совсем корректное. BellicВернусь всеж к одному месту в реальной Процедуре: Код: pascal 1. В строковой переменной SStroka происходит таким образом "накопление" нужных мне данных.При большом объеме даных и частом вызове есть вероятность фрагментации памяти. Для уменьшения фрагментации можно использовать массив по аналогии с TList. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 16:48 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Freedoom, тут было сравнение времени для использования в реальной процедуре, а не чисто дле теории! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 17:38 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellic, побайтовое чтение с диска будет намного медленнее, чем чтение блоком всего файла. Это очевидный факт, на мой взгляд, не требующий таких вариантов проверки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 19:40 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Bellic, Попробуй ещё побитовое чтение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 20:37 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
чччДBellic, Попробуй ещё побитовое чтение.Невероятно остроумно!..))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 23:31 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
BellicчччДBellic, Попробуй ещё побитовое чтение.Невероятно остроумно!..))) Если организовать флэшмоб с криком "давайте предложим еще более скоростной способ сравнения бинарников, пока я принимаю пищу/отхожу ко сну/занимаюсь сексом (нужное подчеркнуть)", предложения будет еще остромнее. Это к тому, что во всем желательно меру соблюдать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2017, 09:51 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Док, Просто оптимизации не для всех Кто-то может, кто-то нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2017, 10:11 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, Вот вот. Поэтому нужно CachedBuffers выкинуть и сделать быстро и просто одной строкой кода :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2017, 10:37 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
авторЭто самый быстрый способ побайтного чтения твоих файлов Вместо того, что бы сделать как нужно - читать всё и сразу - предлагаешь новичку фигню. А он ведётся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2017, 10:39 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
BellicНа основе "Memory-Mapped File" получился следующий код: Очень много ненужных try-finally, они даже в RTL коде не нужны в таком количестве, а при работе с Winapi, где исключений не может всплыть по определению (ну кроме совсем запущенных случаев) они вообще избыточны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2017, 10:52 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
Василий №2Очень много ненужных try-finally, они даже в RTL коде не нужны в таком количестве, а при работе с Winapi, где исключений не может всплыть по определению (ну кроме совсем запущенных случаев) они вообще избыточны.А вы напишите свой вариант, не стесняйтесь!..))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2017, 12:08 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
BellicА вы напишите свой вариант, не стесняйтесь!..))) Я просто советую, на будущее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2017, 18:16 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
makhaon, Ну так кто же знал, что у него файлы крохотные будут ) Я человек простой - вижу стримы - шлю на CachedBuffers) Кстати судя по тестам вариант с CachedBuffers может быть быстрее TBytes-варианта. Потому что пока прочитанный кусок памяти обрабатывается, последующий может подготовадиваьься для чтения файловой системой - такая особенность последовательной обработки файлов. Кроме того 64Кб буфер всегда будет в кеше, а для 10Мб будет постоянный кешмисс. Но в этом случае придётся отказаться от высокоуровневой ReadData и обращаться напрямую к прочитанному буферу. Но в этом случае код усложнится до уровня, невоспроизводимого топик стартером ближайшие 10 лет ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2017, 18:43 |
|
||
|
Оптимизация побайтового чтения и сравнения двух бинарных файлов
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU...Кстати судя по тестам вариант с CachedBuffers может быть быстрее TBytes-варианта... Пока по тестам видно, что твои буферы отработали медленнее в 30 раз. Разве что буферам специальные тесты нужны... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2017, 18:52 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2041399]: |
0ms |
get settings: |
5ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
207ms |
get topic data: |
12ms |
get forum data: |
4ms |
get page messages: |
111ms |
get tp. blocked users: |
2ms |
| others: | 217ms |
| total: | 576ms |

| 0 / 0 |
