Как мне измерить производительность моего кода elisp? Какие инструменты / внешние пакеты доступны для измерения времени?
В дополнение к общему времени, я могу видеть профиль, который показывает время, затраченное на функцию? Можно ли также профилировать использование памяти?
performance
benchmarking
Уилфред Хьюз
источник
источник
benchmark
и профилировщиком, не измеряет производительность Emacs . Он измеряет производительность, оценивая конкретные выражения. Это полезно при сравнении производительности в Emacs. Чтобы измерить производительность самого Emacs, вам нужно сравнить его с производительностью чего-то другого, чем Emacs. И именно здесь в игру вступает широта Emacs. Вы можете измерить Emacs против XYZ для того или иного, но для измерения производительности Emacs в целом вам понадобится множество таких сравнений.Ответы:
эталонный тест
Самым простым вариантом является встроенный
benchmark
пакет. Его использование удивительно просто:Он загружается автоматически, поэтому вам даже не нужно его запрашивать.
Профилирование
Бенчмарк хорош в общем тестировании, но если у вас проблемы с производительностью, он не говорит вам, какие функции вызывают проблему. Для этого у вас есть (также встроенный) профилировщик .
M-x profiler-start
.M-x profiler-report
.Вы должны перейти в буфер с навигационным деревом вызовов функций.
источник
benchmark
функция, кажется, не работает: когда я делаю внутри открытого.c
файла(benchmark 100 (c-font-lock-fontify-region 0 17355))
, я продолжаю получатьvoid-function jit-lock-bounds
.benchmark
есть функцииbenchmark-run
иbenchmark-run-compiled
. Для меня основным отличием было то, что обе функции действительно работают (см. Предыдущий комментарий) : ЬВ дополнение к ответу @ Malabara я обычно использую пользовательский
with-timer
макрос, чтобы постоянно обрабатывать различные части моего кода (например, мойinit.el
файл).Разница заключается в том, что, хотя
benchmark
позволяет изучать производительность конкретного бита кода, который вы обрабатываете,with-timer
всегда дает вам время, затрачиваемое на каждую инструментальную часть кода (без больших затрат на достаточно большие части), что дает вам информацию, которую нужно знать какая часть должна быть исследована дальше.Пример использования:
получая следующий вывод в
*Messages*
буфере:Я должен отметить, что это в значительной степени вдохновлено макросом Джона Уигли
use-package-with-elapsed-timer
в его превосходномuse-package
расширении.источник
emacs-init-time
.esup
и мне это нравится. Но опять же, интерес к такой вещи, какwith-timer
не столько к профилированию чего-либо. Реальный интерес заключается в том, что у вас всегда есть информация профилирования. Всякий раз, когда я запускаю emacs, в моем*Messages*
буфере есть куча строк, которые говорят мне, какая часть заняла сколько времени. Если я обнаруживаю что-то ненормальное, я могу использовать любой из более подходящих инструментов для профилирования и оптимизации.emacs-init-time
действительно производит интересную информацию. Тем не менее, он дает только включенное время, без возможности разбить отдельные части инициализации.В дополнении к @ ответу Malabarba, в обратите внимание , что вы можете измерить скомпилированное время выполнения кода с
benchmark-run-compiled
. Этот показатель часто намного важнее интерпретированного времени выполнения, котороеM-x benchmark
дает вам:Три числа - это общее прошедшее время, количество прогонов ГХ и время, проведенное в ГХ.
источник
Бенчмаркинг - это не только получение цифр, но и принятие решений на основе анализа результатов.
На MELPA есть пакет benchstat.el, который вы можете использовать для получения функций, которые предоставляет программа benchstat .
Он реализует сравнительный анализ, основанный на сравнении, в котором сравниваются
X
свойства производительностиY
.Функции Benchstat можно рассматривать как
benchmark-run-compiled
оболочку, которая не только собирает информацию, но и возвращает ее в удобном для чтения формате. Оно включает:X
иY
Очень простой пример использования:
Результаты
benchstat-compare
будут отображаться во временном буфере:Тебе понадобится
benchstat
двоичный файл программы. Если вы использовали язык программирования Go, скорее всего, он уже есть в вашей системе. В противном случае есть возможность скомпилировать его из исходников.Предварительно скомпилированный бинарный файл для linux / amd64 можно найти на странице релиза github .
источник