'gc-cons-threshold'를 매우 높게 설정하고 유휴 상태에서 쓰레기를 수집하는 데 단점이 있습니까?


17

내 상단에 다음 두 줄을 추가했습니다 init.el.

(setq gc-cons-threshold (eval-when-compile (* 1024 1024 1024)))
(run-with-idle-timer 2 t (lambda () (garbage-collect)))

즉, Emacs는 800kb의 할당 된 메모리마다 가비지를 수집하는 대신 유휴 상태 일 때, 즉 일시 중지로 인해 방해받지 않을 때 그렇게합니다. (또한 1GB의 메모리를 할당 한 후에 수집하지만 그럴 것이라고는 생각하지 않습니다).

이로 인해 시작 시간이 약 2/3 향상되었습니다. 이론적으로는 일반적으로 성능도 향상시켜야합니다. 이 방법에 단점이 있습니까?


1
원칙적으로 당신은 설정하지 말아야 gc-cons-threshold실제로 주어진 시간에 명중에 당신이 가정하는 당신이한다고하기 때문에, 당신보다 더있는 거 기꺼이 것입니다 실제로 결국, 사람이 많은 쓰레기가 발생 될 수있는 방법을 알고있다 (때때로 그 값을 명중 예기치 않은 열정적 인 비 유휴 작업으로 인해). 유휴 타이머로 gc를 트리거하는 데 특별한 문제가 보이지 않지만 유휴 상태가 아닌 gc의 임계 값을 OTT처럼 높게 설정하면 내 생각에 값이 "나보다 높은 것으로 선택되었습니다. "내가 사용하고자하는 최고"보다는 "항상 필요할 것"입니다.
phils

5
Stefan Monnier의이 글에 따르면 : "더욱 손대지 마십시오. Emacs-22에서는 gc-cons-threshold를 늘리는 것과 같은 이점을 제공하지만 단점없이 gc-cons-percentage를 도입했습니다. 즉, 사용자가 .emacs에서 gc-cons-threshold 설정을 제거하는 것이 좋습니다. "
izkon

1
@izkon을 제외하고 당신이 링크 한 게시물은 2007 년으로 거슬러 올라가는 반면 , 누군가가 실제로 실험을하고 임계 값을 변경하면 차이는 2016 년으로 거슬러 올라간 이 게시물같습니다 . 잘 작동했습니다.
Hi-Angel

1
@Erik 나는 당신이 대체 할 수있는 생각 (eval-when-compile (* 1024 1024 1024))으로 most-positive-fixnum (그렇게하십시오, 나는 그들의 설정에 귀하의 질문에 복사를 통해 코드를 제공 확신 모두 있어요) .
Hi-Angel

2
@ Hi-Angel 나는 그것이 좋은 생각이라고 생각하지 않습니다. 만약 Emacs가 실제로 유휴 상태가되지 않고 많은 양의 메모리를 할당한다면, 시스템이 메모리를 완전히 교환하거나 고갈시킬 때까지 계속 할당하는 대신 gc를 사용해야합니다. 1GB가 이미 너무 높습니다.
Erik

답변:


4

내가 아는 한, RAM이 있다면 괜찮습니다. 그러나 Emacs가 GC를 시작하기 전에 실제로 사용량이 많으면 시간이 오래 걸릴 수 있습니다. 엘리가 무엇을 의미하는지 잘 모르겠습니다. ISTM은 충분한 메모리가 있다면 괜찮을지 모르지만 그는 여기 전문가입니다.

그러나 init 파일에서이 줄을 한동안 사용해 왔으며 변경 사항을 영구적으로 만들지 않고도 시작 시간을 줄일 수 있습니다.

;;;;; Startup optimizations

;;;;;; Set garbage collection threshold

;; From https://www.reddit.com/r/emacs/comments/3kqt6e/2_easy_little_known_steps_to_speed_up_emacs_start/

(setq gc-cons-threshold-original gc-cons-threshold)
(setq gc-cons-threshold (* 1024 1024 100))

;;;;;; Set file-name-handler-alist

;; Also from https://www.reddit.com/r/emacs/comments/3kqt6e/2_easy_little_known_steps_to_speed_up_emacs_start/

(setq file-name-handler-alist-original file-name-handler-alist)
(setq file-name-handler-alist nil)

;;;;;; Set deferred timer to reset them

(run-with-idle-timer
 5 nil
 (lambda ()
   (setq gc-cons-threshold gc-cons-threshold-original)
   (setq file-name-handler-alist file-name-handler-alist-original)
   (makunbound 'gc-cons-threshold-original)
   (makunbound 'file-name-handler-alist-original)
   (message "gc-cons-threshold and file-name-handler-alist restored")))

왜 사용하지 after-init-hook않습니까?
Erik

3
초기화 직후에 실행되기 때문에 사용자가 GC를 기다릴 수 있습니다. 유휴 타이머를 사용하면 사용자가 Emacs를 사용하지 않을 때 실행될 수 있습니다.
blujay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.