Ускорение работы функции Pos() в 64-битной версии Delphi
Вопрос о скорости работы функции Pos() в 64-битной версии Delphi актуален для разработчиков, сталкивающихся с необходимостью оптимизации производительности приложений. Вопрос пользователя заключался в поиске кода для версии Pos(), которая была бы такой же быстрой в 64-битной среде, как и в 32-битной.
Проблема
В 32-битной версии Delphi с версии XE5 используется ускоренная версия Pos() с помощью ассемблера FastCode, которая значительно быстрее, чем версия на PurePascal. В 64-битной версии используется именно такая, медленная версия PurePascal, что приводит к заметному увеличению времени выполнения операций.
Анализ
Тесты, проведенные пользователем, показали, что в цикле с большим количеством итераций:
В 32-битной версии время выполнения составляло 65-90 мс.
В 64-битной версии время выполнения увеличивалось до 280-300 мс.
Альтернативные ответы
Пользователи предлагали различные альтернативы, включая использование функции wcsstr из библиотеки msvcrt.dll, которая показала себя лучше, чем стандартная Pos() в 64-битной среде. Однако, после дополнительных тестов, было установлено, что алгоритм PosEx_Sha_Pas_2 от Fastcoders может быть более эффективным.
Подтвержденный ответ
Использование алгоритма PosEx_Sha_Pas_2 от Fastcoders в PurePascal позволяет добиться ускорения работы функции Pos() в 64-битной версии Delphi. Пример кода алгоритма представлен ниже:
function PosEx_Sha_Pas_2(const SubStr, S: string; Offset: Integer = 1): Integer;
// Код алгоритма PosEx_Sha_Pas_2
end;
Тестирование алгоритма на 64-битной версии показало следующие результаты:
System.Pos - 18427 мс
wcsstr - 8122 мс
PosEx_Sha_Pas_2 - 2282 мс
Для 32-битной версии результаты были следующими:
System.Pos - 2171 мс
wcsstr - 9634 мс
PosEx_Sha_Pas_2 - 1868 мс
Выводы
Алгоритм PosEx_Sha_Pas_2 в 64-битной версии работает почти так же быстро, как Pos в 32-битной версии, и даже быстрее в некоторых случаях. С версии Delphi 11.0 Alexandria стандартная версия Pos() в PurePascal использует именно этот алгоритм.
Заключение
Для улучшения производительности работы со строками в 64-битной версии Delphi рекомендуется использовать функцию PosEx_Sha_Pas_2. Это позволит приблизиться к скорости работы Pos() в 32-битной версии и даже превзойти её в некоторых сценариях использования.
Ускорение работы функции `Pos()` в 64-битной версии Delphi достигается за счет использования оптимизированного алгоритма, который приближает производительность к уровню 32-битной версии.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.