Почему \% (\) быстрее, чем \ (\) в Vim? - PullRequest
5 голосов
/ 12 апреля 2009

Я смущен документами:

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

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

Ответы [ 2 ]

11 голосов
/ 12 апреля 2009

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


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

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

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

s@\<\([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) (?:...) для регулярного выражения без захвата.

4 голосов
/ 12 апреля 2009

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

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

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

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

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