Chcę wykonać wariant dopasowania zakotwiczonego blokowania czcionek. Mam definicje funkcji, które zaczynają się od listy nazw, i chcę, aby te nazwy były podświetlone w treści funkcji.
Stworzyłem funkcję, która to robi, i zarejestrowałem ją jako funkcję blokady jit z rejestrem blokady jit, jednak wydajność jest dość niska i przewijanie opóźnień w większych plikach.
- Jak mogę zmierzyć wydajność? Jeśli po prostu czas na wywołanie mojej funkcji na dużym pliku (z czasem zmiennoprzecinkowym przed i po lub z elpem) mam bardzo różną wydajność, zajmuje to od 0,65 do 12 sekund. Czy istnieje zalecany sposób na sprawdzenie wydajności blokowania czcionek?
- Czy jest jakaś różnica w wydajności między zakotwiczonym dopasowaniem zdefiniowanym w słowach kluczowych blokujących czcionkę a dodaniem funkcji za pomocą rejestru blokującego?
Edycja: Wygląda na to, że zmienność wydajności jest związana z odśmiecaniem, wywołania mojej funkcji blokowania jit stają się coraz wolniejsze przy każdym wywołaniu, aż do uruchomienia odśmiecania, w którym to momencie znów stają się szybkie.
font-lock
performance
Joakim Hårsman
źródło
źródło
Odpowiedzi:
Okazuje się, że bardzo zróżnicowana wydajność była związana z odśmiecaniem. Każde wywołanie funkcji będzie działało wolniej, dopóki nie zostanie uruchomione czyszczenie pamięci. Z zapasowymi emacsami, gc był uruchamiany co kilka sekund, ale miałem init w linii, aby skrócić czas uruchamiania, który ustawił próg gc-cons na 20 MB, a to oznaczało, że gc był uruchamiany znacznie rzadziej, powodując zgłaszaj coraz wolniejsze taktowanie, aż gc zostanie uruchomiony po kilku minutach, wtedy czasy zaczną spadać i znów będą szybkie.
Po przywróceniu domyślnej wartości gc-cons-threshhold testowanie stało się łatwiejsze.
Następnie profilowałem pod kątem pamięci za pomocą wbudowanego profilera (
M-x profiler-start
) i odkryłem, że wywołania do składni-ppss powodowały najwięcej alokacji, więc po pewnej optymalizacji w celu wywołania składni-pps rzadziej osiągałem akceptowalną wydajność.Korzystanie z trybu blokowania czcionek (dodawanie funkcji przez rejestr blokady blokad) wydaje się być najłatwiejszym sposobem na niezawodne blokowanie czcionek wielowierszowych, dlatego wybrałem tę metodę.
Edycja: Po odkryciu, że wydajność wciąż nie była wystarczająca w bardzo dużych buforach, spędziłem dużo czasu optymalizując użycie procesora i alokację procesora, mierząc poprawę wydajności za pomocą wbudowanego narzędzia Emacs profiler (
M-x profiler-start
). Jednak Emacs nadal się jąka i zawiesza podczas szybkiego przewijania bardzo dużych buforów. Usunięcie funkcji blokady jit, w której się zarejestrowałem,jit-lock-register
spowoduje usunięcie jąkania i zawieszenie się, ale profilowanie pokazało, że funkcja blokady jit zakończyła się po około 8 ms, co powinno być wystarczająco szybkie, aby płynnie przewijać. Usunięcie połączenia z,jit-lock-register
a zamiast tego za pomocą zwykłego dopasowywania czcionek blokujących słowa kluczowe rozwiązało problem.TLDR: Robienie tego było powolne i zacinało się:
Zrobienie tego było szybkie i nie zacinało się:
źródło
dyalog-fontify-locals
.dyalog-fontify-locals-matcher
powinno byćmy-font-lock-matcher
i jednym z takichend
powinno byćlimit
. W każdym razie naprawdę interesujące odkrycie!gc-cons-threshold
jeśli masz problemy z wewnętrznymi wartościami wyłącznie w celu skrócenia czasu uruchamiania, sugeruję, abyśemacs-startup-hook
później je przywrócił.