시동 속도를 높이려면 어떻게해야합니까?


41

시작 시간을 줄이기 위해 할 수있는 몇 가지 기본 사항은 무엇입니까?

그 문제에 특히주의를 기울여야 할 것이 있습니까?

참고 : Emacs를 덜 자주 (세션 당 한 번) 시작하고 실행중인 인스턴스에서 파일을 열어 시작 시간을 줄일 수 있습니다 . 이 질문은 세션 시작 또는 Emacs 시작이 필요한 다른 시간의 시작 시간을 최소화하는 것입니다.


50 개 이상의 30 개 및 "일부"즐겨 찾기 책갈피에 대한 질문 및 답변 점수와 함께 Stack Overflow 에서 동일한 질문을 참조하십시오 . 여기서 좋은 대답은 스택 오버플로에서 사용할 수있는 것 이상이어야합니다.


1
나는 이것에 대한 데이터를 갖고 싶지만 대부분의 사용자에게는 시작 시간을 크게 만드는 하나 또는 두 개의 패키지가 있다고 생각합니다. 제 경우에는 지배적이었습니다. Helm을 사용하면 실제로 초기화를 연기 할 수 없으므로 즉시 사용할 수 있습니다. 나는 아이비로 전환했고 시작 시간이 약 12 ​​초에서 1 초 미만으로 줄었습니다. 서버 / 클라이언트 설정 사용을 중단했습니다. (그런데, 나는 시작 시간을 줄이기 위해 전환하지 않았다, 그것은 단지 좋은 부수적 이점이었다.)
Omar

답변:


43

축소에 대한 나의 요점 emacs-init-time은 데몬이나 서버를 사용하는 것과 같은 것을 다루지 않으며 emacs를 닫을 필요는 없다는 것입니다.

하지 마십시오 :

  • 패키지에 적절한 자동로드 쿠키가없는 경우 init에 패키지를 요구하지 마십시오. 입력 명령에 자동로드를 설정하십시오. 따라서 패키지를 처음 사용할 때 foobar전화를 foobar-mode해서 foobar사전 자동로드되지 않은 경우 다음과 같은 것이 필요합니다.

    (autoload 'foobar-mode "foobar")
    

    이렇게하면 패키지가 아직로드되지 않은 foobar-mode경우에도 전화를 걸 수 있습니다 foobar. 이 방법 foobar은 실제로 전화 할 때까지로드되지 않습니다foobar-mode

  • package-refresh-contents시작할 때 패키지를 설치할 필요가 없으면 실행하지 마십시오 . 누락 된 패키지를 자동 설치하도록 초기화 된 경우 자동 설치 발생시기를 지정할 명령 줄 인수를 고려하십시오.

  • 위와 같이 네트워크 관련 작업을 수행하지 마십시오.
  • desktop정말로 원하지 않는 한 init을 로드하지 마십시오 .

하다

  • use-package패키지 관리 와 같은 것을 사용하십시오. 이를 통해 필요한 사항, 나중에 무엇을로드할지, 무엇을 자동로드하는지, 패키지별로 패키지별로 init를 쉽게 프로파일 링 할 수 있습니다.

  • 테마를로드하고 활성화하는 것의 차이점을 알고 있습니다. 요컨대, 원하는만큼로드 할 수 있지만 둘 이상을 활성화하지 않아야합니다. 이상적으로는 하나의 테마 만로드하고 활성화하십시오. load-theme테마를 사용하지 않으려면 선택적 인수가 필요합니다. 실수로 시작하는 동안 느리고 추악한 여러 테마를 실수로 쉽게 활성화 할 수 있습니다.

  • 치트 : 초기화 할 때 언두 트리, 자동 완성, ido-mode 등과 같은 대형 전역 모드가있는 경우가 많다 . 나는 이것을 할 것이고 undo-tree-mode, ido다른 사람들 은 실제로 그것을 사용해야 할 때까지 이미로드되어 있기 때문에 지연을 느끼지 않습니다.

    업데이트 : use-package가 약간 변경되었습니다. 타이머 기능을 사용하기 전에 공식 readme를 읽으십시오.

    예를 들어 로딩을 약간 지연시키고 global-undo-tree-mode싶다면 이것을 init에 넣을 수 있습니다.

    (run-with-idle-timer 1 nil (lambda () (global-undo-tree-mode t)))
    

    이제 init은 행복하게 계속 진행될 수 global-undo-tree-mode있으며 다른 모든 것이 준비되고 당신이 바퀴 뒤에있을 때까지 실제로 활성화되지 않습니다.

    use-package: idle 키워드를 사용하여 이러한 종류의 동작을 지원합니다. undo-tree내 .init.el 의 구성은 다음과 같습니다 .

    (use-package undo-tree
      :idle (global-undo-tree-mode 1)
      :bind (("C-c j" . undo-tree-undo)
             ("C-c k" . undo-tree-redo)
             ("C-c l" . undo-tree-switch-branch)
             ("C-c ;" . undo-tree-visualize))
      :ensure t)
    
  • init의 프로파일을 작성하십시오. 실제 속도가 느려지는 곳을 보는 것은 항상 놀라운 일입니다. profile-dotemacs.el 은 ~ 6 초에서 <1 초로 초기화하는 데 유용한 도구입니다.

잘 구성된 use-packageinit은 엄청나게 빠를 수 있습니다. init를 바이트 컴파일하지 않고 use-package95 패키지를 구성하고 1 초 안에 시작합니다.


7
"초기 프로파일을 작성하십시오. 실제 속도가 느려지는 곳을 보는 것은 항상 놀라운 일입니다." 스포일러 경고 (require 'org)입니다. :-)
Malabarba

@Jordan, 항목 기능에 자동 로딩 설정이 있는지 확인한 다음 특히 undo-tree 모드의 경우 패키지를로드하기 위해 init에서 유휴 타이머를 시작하는 방법에 대해 조금 더 설명해 주시겠습니까? 감사.
Francisco Dibar

@FranciscoDibar 예제로 게시물을 업데이트했습니다.
Jordon Biondo

2
나는 ido-mode를 즉시 사용한다. smex를위한 Cx Cf 또는 Mx는 내가 emacs를 열 때 가장 항상 가장 먼저하는 일이며, 문제를 발견 한 적이 없다. 또한 이맥스를 연 후 1 초 안에 무언가를 취소하고 싶다면 ... 아무 말도 할 말이 없습니다. 정말로 우려되는 경우 직접 시도하거나 유휴 상태가 아닌 타이머를 사용하거나 초기화 후크 후에 사용하십시오.
Jordon Biondo

1
유휴 타이머 제안이 유용합니다. 약간 더 짧은 로딩 구문은 (run-with-idle-timer 1 nil #'global-undo-tree-mode)'. If the function you are loading takes parameters you can just provide them after the # '`명령입니다.
앤드류 스완

8

최근에 emacs reddit 에 나타나는 것 : init 파일의 시작 부분 근처에 이것을 가비지 콜렉션 호출 수를 줄이십시오.

(setq gc-cons-threshold 50000000)

(add-hook 'emacs-startup-hook 'my/set-gc-threshold)
(defun my/set-gc-threshold ()
  "Reset `gc-cons-threshold' to its default value."
  (setq gc-cons-threshold 800000))

위의 예에서 GC는 ~ 50MB (기본값 ~ 800kb 대신)마다 호출되는데, 이는 RAM이 많은 최신 시스템에서 합리적인 것으로 보입니다.


1
그 가치가 (a) 아마도 당신이 필요로하는 것보다 더 높은 것을 제외하고 (나는 그 10 분의 1과 차이가 보이지 않습니다); 그리고 (b) 큰 GC 임계 값은 GC가 발생할 때마다 더 긴 지연과 같기 때문에 시작을 넘어서 유지하고자하는 값이 아닙니다. 초기화를 위해 높게 설정 한 경우 초기화 후에 다시 낮게 설정하십시오. 그게 emacs-startup-hook좋은 곳 이라고 생각 합니다.
phils

1
@phils 감사합니다! (a) 내 설정에서 50Mb는 최소 수의 GC (및 최소 시작 시간)를 제공합니다. 10Mb만큼 낮아지면 차이가 눈에 띄거나 측정 가능합니다 (실제로 많이 변하지는 않지만 ...) (b) 좋은 생각입니다. 감사합니다. 귀하의 의견을 반영하여 게시물을 수정했습니다.
ffevotte

6

시작 시간을 최적화하는 데 소요되는 시간은 Emacs가 시작하기를 기다리는 모든 추가 시간보다 클 것입니다.

현재 requireinit 파일에서 25 번의 호출을 수행하여 Flycheck가 코드에서 맞춤법 오류를 찾을 수 있습니다. 시작 시간은 ...

$ time emacs --eval '(save-buffers-kill-terminal)'

real    0m2.776s
user    0m2.305s
sys     0m0.148s

또한 내 시스템 time emacs -Q --eval '(save-buffers-kill-terminal)'에는의 real0m0.404s있습니다. 내가 저장할 수있는 이론적 인 최대 시간은 2.3 초입니다.

init 파일에 모든 최적화 문제를 만드는 데 한 시간을 소비한다고 가정 해보십시오. (나중에 init 파일이 바이트 컴파일되어 변경 사항이 적용되지 않는 이유를 파악하기 위해 나중에 15-30 분을 소비 한 추가 시간은 계산하지 않습니다.) (또한 그 시간도 계산하지 않습니다. require전화를 제거하지 않으면 Flycheck가 디버거에 저를 저장했을 것 입니다.) 한 시간에 3600 초가 있으므로 전체 2.3 초를 절약 할 수 있다면 1565 년 시작한 후에야 시간에 대한 투자가 이루어집니다.

하루에 3 번씩 Emacs를 다시 시작했다고 가정하면, 그 투자액이 지불되기까지 1 년 반이 걸릴 것입니다. 한 번에 며칠 동안 동일한 Emacs 인스턴스를 실행 상태로두면 (주로하는 것처럼) 일주일에 2 ~ 5 회만 다시 시작해야하는데,이 경우 투자 비용을 지불하는 데 6 ~ 15 년이 걸립니다.

스타트 업을 최적화하는 데 1 시간 이상을 소비 할 가능성이 높기 때문에 관대합니다. 이론상 최대 시간 (초)을 절약하지 못할 것입니다.


12
그러나 당신은 잠재적으로 더 행복 할 것입니다.
Phil

2
한 사람에게는 사실 일 수 있지만 StackExchange의 요점은 공유에 관한 것입니다. 한 사람을 찾는 데 30 분이 걸리지 만 수십 명의 시작 시간을 1 초 정도 단축시키는 트릭은 어떻습니까? 여전히 나쁜 투자라고 생각하십니까?
ffevotte

@phils 아이러니하게도, 나는 같은 말을하는 것을 고려했지만 내 자신의 견해를지지합니다! "당신은 시작 시간에 대해 신음하기 전에 스스로에게 '이것을 최적화하는 데 시간을 낭비하지 않아서 기쁘다!'라고 생각하십시오."
Jackson

@Francesco 그리고이 포스트는 수십명의 시간을 절약하는 나의 비법입니다.
잭슨

@ 잭슨 나는 여전히이 특정 문제에 대해 당신과 동의하지 않지만 적어도 지금은 당신의 요점이 보입니다. 감사합니다 :)
ffevotte
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.