Отключение обратных ссылок в Perl - PullRequest
6 голосов
/ 28 сентября 2010

Мне сказали, что отключение обратных ссылок в perl повышает производительность (при условии, что вы их не используете), и что если вы не используете какие-либо обратные ссылки, perl сделает это самостоятельно.

Теперь у меня есть Perl-скрипт с большим количеством регулярных выражений, и только один использует обратную ссылку, и я хотел бы знать следующее:

  • Учитывая, что у меня очень большое количество регулярных выражений (предположим, что большая часть моего времени обработки - регулярное выражение), является ли отключение обратных ссылок значительным улучшением производительности? или есть критерии, которые я могу использовать, чтобы узнать, так ли это?
  • Есть ли способ, которым я могу отключить обратные ссылки один раз в начале и включить его только тогда, когда мне это нужно (я знаю о (?:, но я не хочу добавлять его к каждому группировка)
  • Позволит ли область видимости perl оптимизировать это поведение для меня по ссылкам (т. Е. Изменится ли sub или eval независимо от того, отключает ли perl обратную ссылку для вещей вне его)?

Ответы [ 2 ]

15 голосов
/ 28 сентября 2010

Использование круглых скобок только штрафует регулярные выражения, которые их используют, поэтому используйте их там, где вам нужно захватить, но используйте не захватывающие скобки (?:...), когда все, что вам нужно, это группировка.

Использование любого из глобальныхпеременные соответствия

$` $& $'

налагают снижение производительности на все регулярные выражения, поэтому избегайте их использования, если это возможно.(Но как только вы это сделаете, сходите с ума! Вы уже заплатили цену.) Нет способа включить и выключить это.Как только Perl обнаруживает, что они используются где угодно (даже в сторонних модулях, которые вы можете использовать), эта функция включается.

Начиная с Perl 5.10.0, существуют альтернативы для глобальных переменных соответствия, которые только штрафуютрегулярные выражения, которые их используют.Если вы добавите модификатор /p к определенному регулярному выражению, вы сможете использовать вместо него

${^PREMATCH} ${^MATCH} ${^POSTMATCH}

.

2 голосов
/ 28 сентября 2010

Единственный реальный способ проверить это самостоятельно профилировать.Взгляните на модуль Benchmark (он в ядре perl, поэтому вам не нужно его устанавливать).Установите пару тестов: один, где у вас есть функция, которая имеет (скажем) десять регулярных выражений без каких-либо обратных ссылок, и тот, который имеет те же десять, но один из них использует обратные ссылки.

Если вы обнаружите, что обратная ссылка-включая регулярное выражение действительно замедляет остальные ваши регулярные выражения, может быть, попробуйте переписать его, чтобы как-то не включать обратную ссылку ...?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...