Предложение настройки debug-on-quit
- t
, чтобы вы могли узнать, что такое Emacs, является хорошим. Вы можете думать об этом как о форме профилирования выборки с помощью одного образца: часто вам нужен только один образец.
Обновление: Начиная с версии 24.3, Emacs содержит два профайлеры. В profiler.el
есть (новый) пробоотборник пробоотбора и (старый) инструментальный профилировщик в elp.el
.
Пробоотборник пробоотбора documented here. Это довольно просто:
Для начала профилирования введите M-x profiler-start
. Вы можете выбрать профиль, используемый процессором, использование памяти или и то, и другое. После выполнения какой-либо работы введите M-x profiler-report
, чтобы отобразить сводный буфер для каждого ресурса, который вы выбрали для профиля. Когда вы закончите профилирование, введите M-x profiler-stop
.
Вот пример вывода с профайлера cpu+mem
с Perforce/Emacs integration, который я поддерживаю. Я раскрыл самую верхнюю функцию (progn
), чтобы найти where the CPU time and memory use is coming from.
Function Bytes %
- progn 26,715,850 29%
- let 26,715,850 29%
- while 26,715,850 29%
- let 26,715,850 29%
- cond 26,715,850 29%
- insert 26,715,850 29%
+ c-after-change 26,713,770 29%
+ p4-file-revision-annotate-links 2,080 0%
+ let 20,431,797 22%
+ call-interactively 12,767,261 14%
+ save-current-buffer 10,005,836 11%
+ while 8,337,166 9%
+ p4-annotate-internal 5,964,974 6%
+ p4-annotate 2,821,034 3%
+ let* 2,089,810 2%
Вы можете видеть, что виновником является c-after-change
, так это выглядит, как если бы я мог сэкономить много процессорного времени и памяти на locally binding inhibit-modification-hooks
to t
around this code.
Вы также можете использовать Profiler Profiler Emacs Lisp. Это скорее недостаточно документально: вам нужно будет прочитать комментарии в elp.el
, но в основном вы запускаете elp-instrument-package
, чтобы включить профилирование для всех функций с заданным префиксом, а затем elp-results
, чтобы увидеть результаты.
Вот некоторые типичные выходные после ввода M-x elp-instrument-package RET c- RET
, fontifying 4000 строк на С, а затем запустить elp-results
(и используя elp-sort-by-function
для сортировки по количеству вызовов):
Function Name Call Count Elapsed Time Average Time
============================= ========== ============ ============
c-skip-comments-and-strings 107 0.0 0.0
c-valid-offset 78 0.0 0.0
c-set-offset 68 0.031 0.0004558823
c-end-of-macro 52 0.0 0.0
c-neutralize-CPP-line 52 0.0 0.0
c-font-lock-invalid-string 20 0.0 0.0
c-set-style-1 19 0.031 0.0016315789
...
В вашем конкретном случае профайлер не помогает немедленно, потому что вы не знаете, какой пакет неисправен. Но если вы можете сделать предположение (или использовать debug-on-quit
, чтобы найти его наверняка), то профилировщик поможет вам детально диагностировать проблему.
Хороший вопрос, я Eval-выражение все время, но этот режим отладки hadn» t изначально произошел со мной. – EnigmaCurry
Вы не хотите оценивать каждый сексп по очереди (если у вас их очень мало). Используйте двоичный поиск с 'eval-region '. – Drew