wydajność „wstecz”

10

Mam trochę kodu (looking-back … (line-beginning-position)). Dokumentuj ciąg looking-backstanów, że lepiej jest unikać tej funkcji z powodu spowolnienia. Jestem ciekaw, czy kolejne podejście będzie szybsze?

(save-excursion
  (goto-char (line-beginning-position))
  (looking-at regexp stuff))
Geradlus_RU
źródło
Będzie szybciej. Ale to nie jest równoważny kod.
abo-abo
@ abo-abo, tak, nie jest. Ale w moim przypadku uważam, że mogę łatwo wprowadzić looking-atwersję. Dziękuję Ci.
Geradlus_RU
2
Największym problemem związanym z wydajnością jest spojrzenie wstecz, gdy nie ma limitu (lub limitu, który jest daleko). Jeśli uważasz, (with-temp-buffer (insert (make-string 10000 ?x)) (looking-back "y"))że zobaczysz, to jest bardzo szybkie. Teraz zmień wyrażenie regularne na ".*y": jest nieznośnie powolne, chociaż dla czytelnika jest jasne, że to nigdy nie będzie pasować.
YoungFrog

Odpowiedzi:

9

Zdecydowanie. Szczególnie zyskasz, jeśli po prostu chcesz przetestować char-beforelub wyszukać literałowy ciąg. A jeśli musisz użyć, looking-backspróbuj użyć LIMITargumentu, jeśli to możliwe.

Przykład zawiera błąd Emacsa nr 17284 .

Rysował
źródło