Оптимізація продуктивності блокування шрифту


13

Я хочу виконати варіант узгодження прив’язаного блокування шрифту. У мене є визначення функцій, які починаються зі списку імен, і я хочу, щоб ці імена були виділені всередині функції функції.

Я створив функцію, яка це робить, і зареєстрував її як функцію jit-lock з jit-lock-register, однак продуктивність досить низька, і прокрутка відстає у великих файлах.

  • Як я можу оцінити ефективність? Якщо я просто час викликаю свою функцію у великому файлі (з плаваючим часом до і після або з elp), я отримую дивовижну продуктивність, це займе що-небудь від 0,65 до 12 секунд. Чи є рекомендований спосіб оцінити ефективність блокування шрифту?
  • Чи є якась різниця у продуктивності між прив’язаним матчером, визначеним у шрифтових блокуваннях ключових слів, і додаванням функції через jit-lock-регістр?

Редагувати: Здається, що змінність продуктивності пов'язана зі збиранням сміття, виклики моєї функції jit-lock піднімаються послідовно повільніше з кожним викликом, поки не буде запущено збирання сміття, після чого вони знову стануть швидкими.


Для першого пункту спробуйте профілер.
Малабарба

Я можу (і використовував) профілер теж бачити, які частини мого коду потребують часу, але оскільки продуктивність настільки непослідовна, важко сказати, чи є якісь зміни, які я вношу, - це поліпшення чи ні.
Йоаким Хорсман

У вас є якийсь код, який ми можемо перевірити? Це може нам дуже допомогти.
PythonNut

1
Хоча не про профілювання та мікрооптимізацію, саме по собі: я знайшов пакет шрифтів-замків-студії ще одним корисним інструментом для розуміння продуктивності блокування шрифту. Це може допомогти так само, як може допомогти будь-який інший інтерактивний налагоджувальний налагоджувач - ви можете виявити шляхи виконання не те, чого очікуєте, і це головне питання продуктивності.
Грег Хендершот

Дякуємо за пораду про шрифт-lock-studio, це приголомшливо! Хоча це не допомагає з функціями jit-lock, але, звичайно, це стосується всього іншого.
Йоаким Херсман

Відповіді:


8

Виявляється, що дивовижна ефективність була пов'язана зі збиранням сміття. Кожен дзвінок у функцію проходитиме повільніше, поки не буде запущено збирання сміття. З біржовими emacs, gc запускався кожні пару секунд, але у мене був рядок у моєму init.el, щоб поліпшити час запуску, який встановив gc-мінус-поріг у 20 Мб, і це означало, що gc запускається набагато рідше, викликаючи показники для повідомляйте про повільніші та повільніші терміни, доки GC не запуститься через пару хвилин, тоді часи спадатимуть і знову стануть швидкими.

Після повернення до gc-cons-threshold за замовчуванням тестування стало простішим.

Потім я профілював пам'ять за допомогою вбудованого profiler ( M-x profiler-start) і виявив, що виклики до синтаксису-ppss викликали найбільше виділень, тому після деякої оптимізації для виклику синтаксису-ppss рідше я досягав прийнятних показників.

Використання режиму jit-lock (додавання функції через jit-lock-register), здається, найпростіший спосіб змусити надійно працювати багаторядкове блокування шрифту, тому це був обраний нами метод.

Редагувати: Після того, як виявив, що продуктивність все ще недостатньо хороша в дуже великих буферах, я витратив багато часу на оптимізацію використання та розподілення процесора, вимірюючи поліпшення продуктивності за допомогою вбудованого в Emacs profiler ( M-x profiler-start). Однак Emacs все одно заїкається і зависає, коли швидко прокручує дуже великі буфери. Якщо вилучити функцію jit-lock, яку я зареєстрував, jit-lock-registerбуло б видалити заїкання та зависання, але профілювання показало, що функція jit-lock завершиться приблизно за 8 мс, що має бути досить швидким для плавного прокручування. Видалення виклику jit-lock-registerта замість цього використання звичайного відповідника шрифтових ключових слів вирішило проблему.

TLDR: Робити це було повільно і заїкалось:

(defun my-font-lock-function (start end)
"Set faces for font-lock between START and END.")

(jit-lock-register 'my-font-lock-function)

Робити це було швидко і не заїкатися:

(defun my-font-lock-function (start end)
"Set faces for font-lock between START and END.")

(defun my-font-lock-matcher (limit)
    (my-font-lock-function (point) limit)
   nil)

(setq font-lock-defaults
  (list 
     ...
    ;; Note that the face specified here doesn't matter since
    ;; my-font-lock-matcher always returns nil and sets the face on
    ;; its own.
    `(my-font-lock-matcher (1 font-lock-keyword-face nil))))

Не могли б ви поділитися кодом, який ви використовували? Ваше рішення може допомогти іншим, хто прагне досягти того самого.
Мануель Уберті

Я не використовував конкретного коду, я просто називав синтаксис-ppss менше. Ви можете переглянути відповідний код тут: bitbucket.org/harsman/dyalog-mode/src/… Шукайте dyalog-fontify-locals.
Йоаким Хорсман

Я думаю, dyalog-fontify-locals-matcherмає бути, my-font-lock-matcherі одним із таких endмає бути limit. У будь-якому випадку, дійсно цікаве відкриття!
Lindydancer

@Lindydancer: Так, дякую. Виправлено.
Йоаким Хорсман

1
Re: gc-cons-thresholdякщо ви псуєтесь із внутрішніми значеннями, щоб просто покращити час запуску, я пропоную вам скористатись emacs-startup-hookдля їх відновлення.
філ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.