2009-04-11 6 views
5

Я запутался в документации:Почему % () быстрее, чем () в Vim?

\%(\) Образец прилагается беглых скобки. */\%(\)* */\%(**E53* Как \(\), но без учета это как подвыражение. Это позволяет использовать , используя больше групп, и немного меньше бит быстрее.

Может кто-нибудь объяснить причину разницы? Это из-за возврата или чего-то еще?

ответ

11

Комментарий «немного быстрее» точен в том, что есть немного меньше бухгалтерии, но упор делается на «немного», а не на «быстрее». В принципе, как правило, материал, соответствующий \(pattern\), должен храниться так, чтобы вы могли использовать \3 (для соответствующего номера), чтобы ссылаться на него в замене. Обозначение % означает, что vim не должен следить за матчем - так что он делает немного меньше работы.


@SimpleQuestions спрашивает:

Что вы имеете в виду под "следить за матчем"? Как это влияет на скорость?

Вы можете использовать скошенные скобки для «захвата» частей совпадающего шаблона. Например, предположим, что мы не будем играть с простыми декларациями функций C - нет указателей на функции или других источников скобок - то мы могли бы иметь замену команды, такие как следующие:

[email protected]\<\([a-zA-Z_][a-zA-Z_0-9]*\)(\([^)]*\))@xyz_\1(int nargs) /* \2 */@ 

Учитывая входной линии, такие как:

int simple_function(int a, char *b, double c) 

выход будет:

int xyz_simple_function(int nargs) /* int a, char *b, double c */ 

(Почему вы можете сделать, что я воображал, что мне нужно, чтобы обернуть функцию C simple_function так что он может быть вызван с языка, скомпилированного в C, который использует другое соглашение об интерфейсе - он основан на Informix 4GL, если быть точным. Я использую его, чтобы получить пример - не потому, что вам действительно нужно знать, почему это было хорошее изменение.)

Теперь в примере \1 и \2 в тексте замены относятся к снятым частям регулярного выражения - имя функции (последовательность буквенно-цифровых символов, начинающихся с буквенного символа, - подсчет подчеркивания как «алфавитный») и список аргументов функции (все между круглыми скобками, но не включая круглые скобки).

Если бы я использовал обозначение \%(....\) вокруг идентификатора функции, то \1 ссылался бы на список аргументов и не было бы \2. Поскольку vim не нужно было отслеживать одну из двух захваченных частей регулярного выражения, она имеет незначительно меньшую бухгалтерскую отчетность, чем если бы ей приходилось отслеживать две захваченные части. Но, как я уже сказал, разница крошечная; вы, вероятно, никогда не сможете измерить его на практике.Вот почему в руководстве говорится, что «он позволяет больше групп»; если вам нужно было группировать части вашего регулярного выражения, но не нужно было ссылаться на них снова, тогда вы могли бы работать с более длинными регулярными выражениями. Тем не менее, к тому времени, когда у вас будет более 9 запоминаемых (захваченных) частей регулярного выражения, ваш мозг обычно делает круговые движения, и ваши пальцы будут делать ошибки в любом случае - так что усилия обычно не стоят того. Но это, я думаю, аргумент для использования нотации \%(...\). Он соответствует нотации Perl (PCRE) '(?:...)' для неконвертирующего регулярного выражения.

+0

Что вы подразумеваете под "отслеживать матч"? Как это влияет на скорость? –

+0

Я действительно проверил - и это работает, как указано. И я проверил версию \% (\\) - не показано выше - и это тоже сработало. Уф! Это происходит не каждый раз, когда все работает правильно. Я был уверен в концепции ... но по-прежнему хорошая идея проверить реальность. –

4

Я спросил в #Vim, будет ли другой быстрее из-за возврата. Godlygeek пользователя ответил:

Нет, это быстрее, потому что вещь, которая соответствует не нужно strdup'ed - любой лишней работы плохой вещь для файла синтаксиса.

Он продолжил:

[Скорость] зависит от того, насколько велики строки. Для 3-х символов, это не имеет большого значения, для 3000 это , вероятно, делает. И имейте в виду, что он должен быть strdup'ed каждый раз, когда он соответствует .... в том числе во время backtracking ... что означает, что даже 3 символа могут быть strdup'ed 1000 раз по курсу соответствия одно регулярное выражение. - файлы синтаксиса находятся в $ VIMRUNTIME/синтаксисе

Смежные вопросы