Spec-Zone.ru › Elisp

Профилирование

Если ваша программа работает правильно, но недостаточно быстро, и вы хотите ускорить или повысить ее эффективность, первым делом следует профилировать ваш код, чтобы узнать, где он тратит большую часть времени выполнения. Если вы обнаружите, что одна определённая функция отвечает за значительную часть времени выполнения, вы можете начать искать способы оптимизации этой части.

Emacs имеет встроенную поддержку для этого. Чтобы начать профилирование, введите M-x profiler-start. Вы можете выбрать периодическое выборочное измерение использования процессора (cpu), когда выделяется память (memory), или оба варианта. Затем запустите код, который вы хотите ускорить. После этого введите M-x profiler-report, чтобы отобразить сводный буфер для использования процессора, измеренного по каждому типу (cpu и память), который вы выбрали для профилирования. Имена буферов отчетов содержат время их создания, поэтому вы можете сгенерировать другой отчет позже, не удаляя предыдущие результаты. После завершения профилирования введите M-x profiler-stop (профилирование связано с небольшими накладными расходами, поэтому мы не рекомендуем его оставлять активным, кроме случаев, когда вы действительно выполняете код, который хотите исследовать).

Буфер отчета профилировщика показывает на каждой строке функцию, которая была вызвана, с указанием того, сколько ресурсов процессора она использовала в абсолютных и процентных показателях с момента начала профилирования. Если в строке есть символ ‘+’ слева от имени функции, вы можете развернуть эту строку, нажав RET, чтобы увидеть функцию(и), вызываемые функцией более высокого уровня. Используйте префиксный аргумент (C-u RET), чтобы увидеть всё дерево вызовов под функцией. Нажатие RET снова вернёт состояние к исходному.

Нажмите j или mouse-2, чтобы перейти к определению функции в текущей точке. Нажмите d, чтобы просмотреть документацию функции. Вы можете сохранить профиль в файл с помощью C-x C-w. Вы можете сравнить два профиля, используя =.

Библиотека 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-call в benchmark.el. Вы также можете использовать команду benchmark для измерения времени выполнения форм интерактивно.

Чтобы профилировать Emacs на уровне его кода C, вы можете скомпилировать его с опцией --enable-profiling для configure. При завершении работы Emacs генерируется файл gmon.out, который вы можете просмотреть с помощью утилиты gprof. Эта функция в основном полезна для отладки Emacs. Она фактически останавливает работу команд Lisp-уровня M-x profiler-…, описанных выше.


Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Profiling.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API