Начиная с билда 4062 скорость исполнения регулярок заметно упала.
Приложен файл test1.lua, запускать можно с комстроки lua:@test1.lua
На моём компьютере времена следующие:
Билд 4061 - 1150 msec
Билд 4062...4131 - 4370 msec
Реально я заметил это на более сложном регулярном выражении, чем использованное в примере. То, что в примере, просто взято "навскидку".
>Теперь мой скрипт исполняется только на 30% медленнее в 4132 по сравнению с 4061. Почему, пока не знаю.
Тоже заметил подобное (перезагрузка макросов начала занимать больше времени).
John Doe wrote:Тоже заметил подобное (перезагрузка макросов начала занимать больше времени).
Скорее всего, регулярки всё-таки не вернулись к прежней скорости. (Чтобы это проверить наверняка, нужно повозиться, т.к. изменение скорости зависит от конкретного выражения.)
Вот произвёл эксперимент: подсчёт слов в чейнжлоге Фара, в редакторе, плагином LF Search (плагин показывает время, затраченное на операцию). Рег. выражение - \w+.
Билд 4061: 0.11 ... 0.13 sec.
Билд 4135: 0.19 ... 0.20 sec.
regex match использует "стек состояний" для своих внутренних нужд.
До 4062 этот "стек" был членом класса RegExp и был имплементирован как вектор неких структур.
Из этого следуют два вывода:
- вектор жил столько же, сколько и содержащий его класс, и во время матча объекты добавлялись туда за амотризированно константное время;
- при попытке матчить из разных тредов вектор превращался в мусор. Внезапно.
В 4062 вектор стал локальной переменной метода match, сам метод таким образом перестал менять состояние класса и стал thread safe.
При этом вектор, естественно, стал пересоздаваться при каждом матче, что, естественно, не бесплатно.
Наверное, можно попытаться навелосипедить дополнительную оптимизацию в виде thread-local вектора, но заниматься этим ради семи сотых секунды на мегабайт текста я как-то не вижу смысла.
Вероятно, библиотека изначально не была рассчитана на многопоточность.
Семь сотых секунды на мегабайт текста - не очень логичная трактовка. Регулярное выражение может быть на порядок-два сложнее, чем использовавшееся. Более правильно сказать, что стало в 1.6 раз медленнее, чем было.
Oniguruma в том же опыте показывает 0.09 ... 0.11 sec., в билде 4135. Не знаю, насколько она thread-safe, но это широко используемая в мире библиотека.
Я лишь предоставляю информацию, что с ней делать - это другой вопрос.