Pull to refresh

Comments 8

Указания версий тестируемых библиотек конечно не хватает. Вот взять к примеру растовский regex. Всего пару месяцев назад вышла версия 1.9.* (https://github.com/rust-lang/regex/blob/master/CHANGELOG.md#190-2023-07-05), где было много чего переписано, и потому результаты могут значительно отличаться от прошлых версий как в лучшую, так и худшую сторону на разных сценариях.

Да, спасибо, что заметили) Добавил версии библиотек.
Касательно rure-go - компилилась растовская либа версии 1.9.3.

Спасибо автору за труд.

У меня буквально пару комментариев по поводу тестов, для которых приведены результаты в первых двух таблицах:

  1. Тест на С измеряет "производительность" работы функции strlen, что IMHO не есть корректно.

  2. В тесте на Rust принудительно выключена опция разбора Unicode строк. Для меня лично это выглядит как попытка мухлежа.

Согласен, автор оригинального репозитория этот момент с Rust назвал "оптимизацией" )

Да и вообще, момент с компиляцией регулярок, тоже можно было бы не включать в замеры, если мы измеряем скорость нахождения. Но решил в Бенчмарке#1 оставить всё как было, лишь добавив аналогичный код для Go библиотек.

Если вас не затрунит, не могли бы вы провести модифицированный тест на С с вызовом strlen до clock_gettime.

Вот обновленные результаты: в Rust включил unicode, в C перенес strlen.

strlen отнимает ~0.15ms в этом бенчмарке.

Language | Email(ms) | URI(ms) | IP(ms) | Total(ms)

Rust | 11.66 | 1.70 | 5.13 | 18.48
C PCRE2 | 110.87 | 100.57 | 10.50 | 221.94

Как измерялось потребление памяти? Оно включает потребление при компиляции выражений? (В целом, компиляцию и поиск нужно всегда мерить отдельно, потому что где компилируют на каждый поиск, там производительность явно не важна.) Числа не выглядят реалистичным потреблением со стороны именно библиотек, про вызов из Go не могу ничего сказать. Например, Hyperscan во время поиска не выделяет память, а принимает предварительно выделенный блок (scratch) фиксированного размера, который зависит только от базы правил. Но FindAllIndex(), которая используется в замерах, создает scratch при каждом вызове, что совершенно неадекватно реальным сценариям.

Спасибо за детали касательно Hyperscan!

Да, total с учетом компиляции мерил. Согласен по поводу отдельного замера компиляции, но исходя из последней таблицы - не такой уж большой объем 5 регулярок занимают в памяти)

Sign up to leave a comment.

Articles