Профилирование
Если ваша программа работает правильно, но недостаточно быстро, и вы хотите ускорить её или сделать более эффективной, сначала нужно профилировать код, чтобы выяснить, на что уходит большая часть времени выполнения. Если окажется, что на одну конкретную функцию приходится значительная часть времени выполнения, можно начать искать способы оптимизировать этот участок.
В Emacs есть встроенная поддержка профилирования. Чтобы начать профилирование, введите M-x profiler-start. Можно периодически собирать данные об использовании процессора (cpu), при выделении памяти (memory) или в обоих случаях. Затем выполните код, который хотите ускорить. После этого введите M-x profiler-report, чтобы отобразить сводный буфер использования процессора для каждого выбранного типа профилирования (процессор и память). В именах буферов отчётов указано время их создания, поэтому позже можно создать ещё один отчёт, не удаляя предыдущие результаты. Когда закончите профилирование, введите M-x profiler-stop (профилирование создаёт небольшую дополнительную нагрузку, поэтому не рекомендуется оставлять его включённым, кроме тех случаев, когда вы действительно выполняете код, который хотите исследовать).
В буфере отчёта профилировщика в каждой строке указана вызванная функция, а перед её именем — абсолютное и процентное количество ресурсов процессора, использованных ею с момента начала профилирования. Если слева от имени функции в строке стоит символ «+», эту строку можно развернуть, нажав RET, чтобы увидеть функции, вызванные функцией более высокого уровня. Используйте аргумент-префикс (C-u RET), чтобы увидеть всё дерево вызовов ниже функции. Повторное нажатие RET свернёт его до исходного состояния.
Нажмите j (profiler-report-find-entry) или mouse-2, чтобы перейти к определению функции в точке. Нажмите d (profiler-report-describe-entry), чтобы просмотреть документацию функции. Профиль можно сохранить в файл с помощью C-x C-w (profiler-report-write-profile), а сохранённый профиль прочитать с помощью M-x profiler-find-profile или M-x profiler-find-profile-other-window. Сравнить два профиля можно с помощью = (profiler-report-compare-profile).
Библиотека elp предлагает альтернативный подход, который полезен, если вы заранее знаете, какие функции Lisp хотите профилировать. При использовании этой библиотеки сначала присвойте elp-function-list список символов функций — это функции, которые нужно профилировать. Затем введите M-x elp-instrument-list RET nil RET, чтобы настроить профилирование этих функций. Выполнив код, который хотите профилировать, вызовите M-x elp-results, чтобы отобразить текущие результаты. Более подробные инструкции см. в файле elp.el. Этот подход позволяет профилировать только функции, написанные на Lisp, но не примитивы Emacs.
Измерить время выполнения отдельных форм Emacs Lisp можно с помощью библиотеки benchmark. См. функцию benchmark-call, а также макросы benchmark-run, benchmark-run-compiled и benchmark-progn в файле benchmark.el. Для интерактивного измерения времени выполнения форм также можно использовать команду benchmark.
Чтобы профилировать Emacs на уровне кода C, его можно собрать с параметром --enable-profiling для configure. При завершении работы Emacs создаёт файл gmon.out, который можно исследовать с помощью утилиты gprof. Эта возможность в основном полезна для отладки Emacs. Фактически она мешает работе описанных выше команд уровня Lisp M-x profiler-….
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Profiling.html