2009-02-20 2 views
42

Я настраиваю Emacs много. Недавно я добавил что-то в мою конфигурацию .emacs, которая спорадически привязывает мой процессор на 100%, но я действительно не знаю, что это такое.Советы для профилирования неверного поведения Emacs Lisp?

Если я нажму C-g кучу раз, в конце концов я получу сообщение ниже минибуфер спрашивает меня, хочу ли я автоматически сохранять мои файлы, а затем, если я хочу полностью отменить emacs. Если я продолжаю говорить «нет» и поддерживаю нажатие C-g, в конечном итоге я смогу вернуться к запуску emacs, как обычно. Через час это произойдет снова.

Я мог бы продолжать, как я, комментируя различные вещи, которые я добавил недавно, перезапуская emacs, пытаясь сузить виновника, но он идет медленно.

Есть ли способ, с помощью которого я могу профилировать emacs, чтобы выяснить, какая функция lisp забивает процессор?

ответ

48

Предложение настройки 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, чтобы найти его наверняка), то профилировщик поможет вам детально диагностировать проблему.

5

Это не является, строго говоря, ответ на свой вопрос, а чем делать закомментировать-и-рестарт вещь, вы можете запустить Emacs с опцией -q, загружать .emacs в буфер и оценить каждый sexpr самостоятельно с Cx Ce выследить оскорбительного.

+0

Хороший вопрос, я Eval-выражение все время, но этот режим отладки hadn» t изначально произошел со мной. – EnigmaCurry

+3

Вы не хотите оценивать каждый сексп по очереди (если у вас их очень мало). Используйте двоичный поиск с 'eval-region '. – Drew

8

Вы пытались: Options->Enter debugger on Quit/C-g? (Это на emacs22)

Если вам нужно отладить запуск Emacs: использовать emacs -q --no-site-file, посетить ваш .emacs (или site-start.el или любой другой), активировать пункт Options->Enter debugger on Quit/C-g меню, а затем пункт Emacs-Lisp->Evaluate buffer меню и C-g, когда он появится заморозить. Там может быть более простой способ сделать это .........

6

С помощью dope.el вы можете просмотреть весь файл .emacs или несколько файлов elisp, загруженных при запуске. Загрузите его с www.gnufans.net/~deego/pub/emacspub/lisp-mine/dope/

M-x dope-quick-start покажет небольшое введение.

Edit: оригинальный URL теперь несуществующей, но есть рабочее зеркало на Git Hub:
https://raw.github.com/emacsmirror/dope/master/dope.el

+0

Благодарим вас за пакет допинга. Я смог перенастроить свои .emacs для загрузки менее чем за секунду, используя этот пакет. :) – Amjith

Смежные вопросы