Я хочу выполнить вариант привязки привязанного шрифта. У меня есть определения функций, которые начинаются со списка имен, и я хочу, чтобы эти имена были выделены внутри тела функции.
Я создал функцию, которая делает это, и зарегистрировал ее как функцию jit-lock с помощью jit-lock-register, однако производительность довольно низкая и задержки прокрутки в больших файлах.
- Как я могу измерить производительность? Если я просто вызываю свою функцию для большого файла (со временем до и после или с elp), я получаю сильно изменяющуюся производительность, это занимает от 0,65 до 12 секунд. Есть ли рекомендуемый способ оценки производительности блокировки шрифтов?
- Есть ли разница в производительности между привязанным сопоставлением, определенным в font-lock-keyword, и добавлением функции через jit-lock-register?
Редактировать: Кажется, что изменчивость в производительности связана с сборкой мусора, вызовы моей функции jit-lock последовательно замедляются с каждым вызовом до тех пор, пока сборка мусора не будет запущена, после чего они снова начнут работать быстро.
font-lock
performance
Йоаким Хорсман
источник
источник
Ответы:
Оказывается, что сильно отличающаяся производительность была связана со сборкой мусора. Каждый вызов функции будет выполняться медленнее, пока не будет запущена сборка мусора. В случае со стандартным emacs gc запускался каждые пару секунд, но у меня в init.el была строка, чтобы улучшить время запуска, которое установило для gc-cons-threshold 20 МБ, и это означало, что gc запускался гораздо реже, вызывая тесты сообщайте все медленнее и медленнее, пока gc не будет запущен через пару минут, тогда времена резко упадут и снова будут быстрыми.
После возврата к стандартному gc-cons-threshhold тестирование стало проще.
Затем я выполнил профилирование памяти с помощью встроенного profiler (
M-x profiler-start
) и обнаружил, что вызовы syntax-ppss вызывают наибольшее количество выделений, поэтому после некоторой оптимизации для вызова syntax-ppss реже я достиг приемлемой производительности.Использование jit-lock-mode (добавление функции через jit-lock-register) кажется наиболее простым способом обеспечить надежную работу многострочной блокировки шрифтов, поэтому я выбрал этот метод.
Изменить: Обнаружив, что производительность все еще недостаточно хороша для очень больших буферов, я потратил много времени на оптимизацию использования и распределения ресурсов процессора, измеряя улучшения производительности с помощью встроенного в Emacs profiler (
M-x profiler-start
). Однако Emacs по-прежнему заикается и зависает при быстрой прокрутке очень больших буферов. Удаление функции jit-lock, с которой я зарегистрировалсяjit-lock-register
, устранит заикания и зависания, но профилирование показало, что функция jit-lock завершится примерно за 8 мс, что должно быть достаточно быстро для плавной прокрутки. Удаление вызоваjit-lock-register
и использование обычного сопоставления font-lock-Keywords решило проблему.TLDR: Делать это было медленно и заикаться:
Делать это было быстро и не заикалось
источник
dyalog-fontify-locals
.dyalog-fontify-locals-matcher
должно быть,my-font-lock-matcher
и один изend
должен бытьlimit
. Во всяком случае, действительно интересное открытие!gc-cons-threshold
если вы работаете с внутренними ценностями исключительно для того, чтобы улучшить время запуска, я предлагаю вам использоватьemacs-startup-hook
для их восстановления впоследствии.