"Gc-cons-eşik" i çok yüksek ayarlamanın ve boşta iken çöp toplamanın bir dezavantajı var mı?


17

Aşağıdaki iki satırı üstüme ekledim init.el:

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

Bu, tahsis edilen her 800kb bellekte çöp toplamak yerine, Emacs'ın boşta olduğunda, yani duraklama beni rahatsız etmediğinde yapar. (Ayrıca 1GB bellek ayırdıktan sonra toplar, ancak bunun olacağını düşünmüyorum).

Bu, başlangıç ​​zamanımı yaklaşık üçte iki oranında artırdı. Teorik olarak, genel olarak performansı da geliştirmelidir. Bu yaklaşımın bir dezavantajı var mı?


1
Prensip olarak, ayarladığınız olmamalıdır gc-cons-thresholdaslında herhangi bir zamanda vurmak için size farz sen gerektiğini, çünkü senden daha yüksek konum istekli olacak aslında sonuçta kim ne kadar çöp tahakkuk olabilir bilir (zaman zaman bu değeri vurmak beklenmedik şekilde hevesli olmayan boş bir görevle). Boşta kalma zamanlayıcısıyla gc'yi tetiklemede belirli bir sorun görmüyorum, ancak boşta olmayan gc için eşiği bu OTT gibi yüksek bir değere ayarlamayı düşünüyorum ve benim izlenimim, değerin muhtemelen "benden daha yüksek" "Kullanmaya hazır olduğum en yüksek değer" yerine "hiç" ihtiyacınız olacak
phils

5
Stefan Monnier'in bu yazısına göre : "Daha iyi dokunmayın. Emacs-22'de, gc-eksileri eşiğini artırmakla aynı dezavantajı olmayan aynı fayda sağlayan gc-eksilerini yüzde olarak tanıttık. Yani kullanıcıların gc-eksileri ile ilgili eşik ayarlarını .emac'lerinden kaldırmasını öneriyorum. "
izkon

1
@izkon dışında bağlandığınız gönderi 2007'ye kadar uzanıyor, örneğin birisinin gerçekten denediği ve eşiği değiştirmenin fark yarattığı bu gönderi 2016'ya kadar uzanıyor. Yani ya geriledi ya da geçici çözüm hiç iyi çalıştı.
Hi-Angel

1
@Erik Sana yerini alabilir mi (eval-when-compile (* 1024 1024 1024))ile most-positive-fixnum (lütfen bunu, onların yapılandırma içine soru kopya genelinde kodunuzu geliyor oldukça emin herkes değilim) .
Hi-Angel

2
@ Merhaba Angel Bunun iyi bir fikir olduğunu düşünmüyorum. Emacs gerçekten boşta kalmadan büyük miktarlarda bellek ayırırsa, sistem tamamen değiştirilinceye veya bellek tamamen tükenene kadar ayırmaya devam etmek yerine gc olmalıdır. Bir şey varsa, 1GB zaten çok yüksek.
Erik

Yanıtlar:


4

Bildiğim kadarıyla, RAM'iniz varsa, sorun değil, ancak Emacs GC'ing'den önce gerçekten çok yüksek bir kullanım yaptıysa, uzun zaman alabilir. Eli'nin tam olarak ne anlama geldiğinden emin değilim; ISTM yeterli belleğiniz varsa, iyi olmalı, ama o burada uzman.

Bunu söyledikten sonra, şu satırları init dosyamda kullandım ve değişiklikleri kalıcı hale getirmeden başlatma süresini azaltmaya yardımcı oluyor:

;;;;; 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")))

Neden kullanmıyorsun after-init-hook?
Erik

3
Çünkü bu başlatma işleminden hemen sonra çalışır ve kullanıcının GC'yi beklemesine neden olabilir. Boş bir zamanlayıcı kullanarak, kullanıcı Emacs kullanmadığında çalışabilir.
blujay
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.