2009-04-11 15 views
5

Jestem zdezorientowany przez docs:Dlaczego % () jest szybsze niż () w Vimie?

\%(\) wzór zamknięty przez zbiegłych nawiasach. */\%(\)* */\%(**E53* Podobnie jak \(\), ale bez zliczania jako podekspresji. To pozwala na używanie większej liczby grup i jest nieco bity o nieco szybszy.

Czy ktoś może wyjaśnić przyczynę różnicy? Czy to z powodu cofnięcia się czy czegoś innego?

Odpowiedz

11

Komentarz "trochę szybciej" jest dokładny, ponieważ jest trochę mniej księgowości do zrobienia, ale nacisk kładzie się raczej na "trochę" niż "szybciej". Zasadniczo, materiał dopasowany przez \(pattern\) musi być przechowywany, aby można było użyć \3 (dla odpowiedniej liczby), aby odnosić się do niego w zastępstwie. Zapis % oznacza, że ​​vim nie musi śledzić meczu - więc wykonuje trochę mniej pracy.


@SimpleQuestions pyta:

Co masz na myśli przez "śledzić mecz"? Jak wpływa na szybkość?

Możesz użyć nawiasów z przypisanymi klawiszami, aby "przechwycić" części dopasowanego wzoru. Na przykład, załóżmy, że gramy z prostych deklaracji funkcji C - nie wskaźniki do funkcji lub innych źródeł nawiasach - wtedy możemy mieć polecenie zamiany takie jak:

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

Biorąc przewód wejściowy, takich jak:

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

wyjście będzie:

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

(Dlaczego warto robić Wyobrażam sobie, że muszę zawinąć funkcję C simple_function tak, że można go wywołać z języka skompilowanego do C, który używa innej konwencji interfejsu - w oparciu o Informix 4GL, aby być precyzyjnym. Używam go dostać przykładowe - nie dlatego, że naprawdę trzeba wiedzieć, dlaczego to była dobra zmiana zrobić)

Teraz na przykład \1 i \2 w tekście zastępującym patrz przechwyconych części. wyrażenia regularnego - nazwa funkcji (sekwencja znaków alfanumerycznych zaczynająca się od znaku alfabetycznego - zliczająca podkreślenie jako "alfabetyczna") i lista argumentów funkcji (wszystko między nawiasami, ale bez nawiasów).

Jeśli użyłbym notacji \%(....\) wokół identyfikatora funkcji, to \1 odwołałoby się do listy argumentów i nie byłoby \2. Ponieważ vim nie musiałby śledzić jednej z dwóch przechwyconych części wyrażenia regularnego, ma on do czynienia z marginalnie mniejszą księgą niż wtedy, gdyby musiał śledzić dwie przechwycone części. Ale, jak powiedziałem, różnica jest niewielka; prawdopodobnie nigdy nie zmierzyłbyś tego w praktyce.Dlatego w podręczniku napisano: "umożliwia więcej grup"; Jeśli chcesz pogrupować części wyrażenia regularnego, ale nie musisz się do nich odsyłać ponownie, możesz pracować z dłuższymi wyrażeń regularnych. Jednak do czasu, gdy masz więcej niż 9 zapamiętanych (przechwyconych) części do regularnego wyrażenia, twój mózg zwykle robi zawroty głowy, a twoje palce i tak będą popełniać błędy - więc wysiłek nie jest zwykle wart tego. Ale to jest, jak sądzę, argument za użyciem notacji \%(...\). Pasuje do zapisu Perl (PCRE) "(?:...)" dla niezapisującego wyrażenia regularnego.

+0

Co masz na myśli przez "śledzenie meczu"? Jak wpływa na szybkość? –

+0

Tak naprawdę sprawdziłem - i działa tak, jak stwierdzono. I sprawdziłem wersję \% (\\) - nie pokazaną powyżej - i to też zadziałało. Uff! Nie dzieje się to za każdym razem, gdy wszystko działa poprawnie. Byłem przekonany o tej koncepcji ... ale nadal dobrze jest sprawdzić rzeczywistość. –

4

Zapytałem w #Vim, czy drugi jest szybszy z powodu cofnięcia. Godlygeek użytkownik odpowiedział:

Nie, to szybciej, ponieważ rzecz, która jest dopasowana nie trzeba strdup'ed - dowolny niepotrzebna praca jest złe dla pliku składni.

Kontynuował:

[Szybkość] zależy od tego, jak duży jest ciąg . Dla 3 znaków, to nie ma większego znaczenia, bo prawdopodobnie 3000 to . I pamiętaj, że musi być strdup'ed za każdym razem, gdy pasuje .... w tym podczas cofania ... co oznacza, że ​​nawet 3 znaki mogą być strdup'ed 1000 razy w trakcie dopasowywania pojedyncze wyrażenie regularne. - pliki składni są w $ VIMRUNTIME/składnia

Powiązane problemy