# Debugging emacs slowness

I use Emacs (emerge) while merging files. Today, when trying to merge some Python code, I found that it was taking exceedingly long time. It was blank for 5 minutes and counting.

Googling revealed that one can print a stack trace under such cases, by having the following line in the .emacs file:

(setq debug-on-quit t)


I did that, restarted Emacs, pressed C-g (Ctrl-g). The stack showed:

Debugger entered--Lisp error: (quit)
syntax-ppss()
python-syntax-context(paren)
python-info-line-ends-backslash-p()
python-nav-end-of-statement()
python-nav-end-of-defun()
byte-code("\306\307!\203\250^@\310 ^X\311\216 \203^V^@\312    W\205^^@\n\2033^@\212\313^R^Kb\210\314 \210\315\307!\210\f^]\316^^^W\317^M!+\206^^@^K\212\312 ^N^X\\^$python-info-current-defun() python-imenu-prev-index-position() imenu-default-create-index-function() byte-code("^H\205\"^@ \n\235?\205\"^@^K\203^[^@\f^KW\204^[^@^K\306U\205\"^@\212^M )\211^V^G\207" [which-func-mode major-mode which-func-non-auto-modes which-func-m$
which-func-ff-hook()
run-hooks(find-file-hook)
after-find-file(nil t)
find-file-noselect-1(#<buffer ServiceDB.py> "file.py" nil nil "file2.py"$find-file-noselect("file.py") ediff-find-file(file-B buf-B ediff-last-dir-B startup-hooks) ediff-files-internal("file.py" "file2.py"$
ediff-merge-with-ancestor("file.py" "file2.py$(let ((base (car (prog1 command-line-args-left (setq command-line-args-left (cdr command-line-args-left))))) (theirs (car (prog1 command-line-args-left (setq comma$
command-line-merge("-merge")
command-line-1(("-merge" "file.py" "file2.py\$
command-line()
normal-top-level()


So it was stuck parsing the Python file. This was a big file (144 KB in size), but still, an inordinate amount of time to parse. The interesting line is which-func-ff-hook(). This comes because I have which-func-mode enabled on my Emacs. This shows which function the cursor is in in the status line:

(which-func-mode t)


I commented that line out, restarted Emacs, and of course, it opened the file in a jiffy!