|
|
|
Поиск в файле с использованием MMF
|
|||
|---|---|---|---|
|
#18+
s62, проверяли на разных данных, не чисто теоретически обуждали) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2019, 15:14 |
|
||
|
Поиск в файле с использованием MMF
|
|||
|---|---|---|---|
|
#18+
Sapersky А как FILE_FLAG_NO_BUFFERING помогает? Я, кстати, не замечал от него эффекта, когда-то пробовал для тестирования, чтобы Винда не кэшировала файл - но заметной разницы в скорости не было, то есть видимо всё равно кэшировала. Тем временем доделал поиск подстроки на SSE2. Быстрее для длинных строк/буферов, для коротких медленнее. https://drive.google.com/open?id=1zVWYmnSq0Lki4_8Ju9E9jnYHHkhKqZvD А Кнут - Моррис - Пратт втроём не смогли забороть одного Л.Толстого. Как я понял, смысл алгоритма в том, чтобы быстро обрабатывать частичные совпадения с подстрокой. Если их мало или нет, то и эффекта от алгоритма нет, получается даже медленнее стандартной Pos (наверное потому, что она на ассемблере). кстати, если искомого слова вообще нет, то алгоритм крэшится с Access Violation потому что вот тут pr1 := @s[m1]; pr2 := @s[m2+1]; pr4 := @s[m4+1]; не проверяется, что m1, m2, m4 = -1 Ну и SearchKMP в случае, если ничего не найдено, вернёт произвольное значение, так как Result не инициализирован ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2019, 15:40 |
|
||
|
Поиск в файле с использованием MMF
|
|||
|---|---|---|---|
|
#18+
defecator Если в начале FormShow поставить SetPriority(True, True) ; то результаты для Pos, Agner/SSE4, SSE2 - не изменятся вообще, а вот для KMP улучшатся ровно в два раза Pos: 131; KMP: 274; SSE4: 11; SSE2: 15 Не знаю в чём дело. Могу предположить агрессивные настройки энергосбережения, при которых CPU можно расшевелить только TIME_CRITICAL на достаточно долгом интервале. defecatorкстати, если искомого слова вообще нет, то алгоритм крэшится с Access Violation Ну и SearchKMP в случае, если ничего не найденоИсправил. https://drive.google.com/open?id=1zVWYmnSq0Lki4_8Ju9E9jnYHHkhKqZvD s62когда-то обсуждали на другом форуме скорость "простого" поиска и упрощенного БМХ (Бойер-Мур-Хорспул). Пришли к выводу, что выигрыш есть для относительно длинных строк, а для искомой подстроки длиной до 6 символов разницы практически нет.В моей реализации зависимость от данных ещё более жёсткая. (ну как - в моей, алгоритм позаимствован отсюда: http://0x80.pl/articles/simd-strfind.html ) В лучшем случае (большой размер основной строки, нет совпадений) будет скорость N/8, для блока в 16 байт делается 2 сравнения. Но в худшем, если подсунуть такую строку, чтобы срабатывал детальный поиск на каждой итерации, получается хуже брут-форса. При этом у Агнеровской функции нет такого падения скорости на неудобных данных. Возможно, стоит всё-таки попробовать PcmpEstrM. До более продвинутых алгоритмов у меня наверное руки не дойдут, если интересно - добавляйте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2019, 22:30 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39900092&tid=2038792]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
158ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 244ms |
| total: | 462ms |

| 0 / 0 |
