Emacs 시작 시간 빠르게 만들기

Posted on Jan 3, 2020

이맥스 설정이 조금씩 자라날 때마다 이맥스를 새로 시작하는 시간도 길어져서 짜증이 슬슬나기 시작했다. 그래서 조금 개선해봤다.

Quelpa + MELPA 거절하기

Quelpa 을 이용해서, MELPA등에 등록된 패키지가 아닌 내가 작성해서 GitHub에 올려놓고 사용하는 패키지를 Git으로 받아서 등록해 사용한다.1

그런데, 어차피 use-pacakge을 이용해서 MELPA 등 패키지를 받아와서 사용하는데, 불필요하게 MELPA 인덱스를 시작할 때마다 받아오고 한다는걸 알게 됐다.

당연히 껐다. 한참 빨라졌다.

참고: Inhibit MELPA git checkout or updates on init

esup profiler

Elisp 자체는 프로파일링이 가능한데2, $HOME/.emacs 같은 init file을 실행하는 시간은 측정이 어려운거 같아서 검색해봤다.

esup 이란 패키지가 있어서 그냥 M-x package-install 설치하고 실행해봤다. 아무런 고민도 없이 바로 이맥스를 새로 하나 더 띄우고 통신을 자동으로 해서 다음과 같이 그럴듯한 시작시간에 소모한 시간을 프로파일링해줬다.

/images/2020-01jan/esup-profile.png

GC 성능 개선하기

esup으로 알게 된 것 중에 그냥 줄이기 쉬워 보이는게, Garbage Collection 시간이었다.

그리고 알고보니, 그렇게 자동적으로 있는 메모리만큼 똑똑하게 GC을 하는게 아니라 특정한 크기나 힙에서의 비율만큼 사용했을 때 GC을 한다는걸 알아서 바꿨다.

  (setq gc-cons-threshold (* 1024 1024 500))

그냥 500MiB 정도 사용하면 GC하도록 했다.

/images/2020-01jan/esup-profile-no-gc.png

그리고 당연히 GC에 시간을 아예 소모하지 않아서 꽤 빨라졌다.

나중에 한번에 너무 크게 GC

하지만 사용하다 보니, 어느새 메모리 사용량이 지정한 threshold만큼 찼고, GC을 하는데 아예 이맥스가 잠시 동안 뻗어 있었었다.

그냥 기다리니까 GC을 정상적으로 마치긴 하더라.

그래도 이런 문제를 해결하기 위해서 다음처럼 타이머를 걸어서 주기적으로 GC을 돌릴 수도 있는거 같다3:

  (run-with-idle-timer 2 t ; 2초마다, repeat
                       (lambda () (garbage-collect)))

그냥 이렇게 안하고, 심심하면 내가 손수 해줄까 고민 중이다.

Footnotes