มีข้อเสียในการตั้งค่า '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)))

นั่นหมายความว่าแทนที่จะรวบรวมขยะทุก ๆ 800kb ของหน่วยความจำที่จัดสรร Emacs ทำเช่นนั้นเมื่อไม่ได้ใช้งานนั่นคือเมื่อการหยุดชั่วคราวไม่รบกวนฉัน (มันยังรวบรวมหลังจากจัดสรรหน่วยความจำ 1GB แล้ว แต่ฉันไม่คิดว่ามันจะเกิดขึ้น)

นี่เป็นการปรับปรุงเวลาเริ่มต้นของฉันประมาณสองในสาม ในทางทฤษฎีมันควรปรับปรุงประสิทธิภาพโดยทั่วไป มีข้อเสียสำหรับวิธีนี้หรือไม่?


1
โดยหลักการแล้วคุณไม่ควรตั้งค่าที่gc-cons-thresholdสูงเกินกว่าที่คุณเต็มใจจะตีในเวลาใดก็ตามเนื่องจากคุณควรสมมติว่าคุณจะตีค่านั้นเป็นครั้งคราว (หลังจากนั้นใครจะรู้ว่าอาจมีขยะมากขึ้น โดยงานที่ไม่ได้ใช้งานบางอย่างที่ไม่คาดคิดอย่างกระตือรือร้น) ฉันไม่เห็นปัญหาใด ๆ เกี่ยวกับการเรียกใช้ gc ด้วยตัวจับเวลาว่าง แต่ฉันคิดว่าการตั้งค่าขีด จำกัด สำหรับ non-idle gc ให้สูงที่สุดเท่าที่ดูเหมือนเป็น OTT และการแสดงผลของฉันก็คือค่าอาจถูกเลือกว่าเป็น "สูงกว่าฉัน ฉันจะต้องการ "มากกว่า" สูงสุดที่ฉันต้องการใช้ "
phils

5
ตามโพสต์นี้โดย Stefan Monnier : "อย่าแตะต้องมันเลยดีกว่าใน Emacs-22 เราแนะนำ gc-cons-เปอร์เซนต์ซึ่งให้ผลประโยชน์เช่นเดียวกับการเพิ่ม gc-cons-threshold แต่ไม่มีข้อเสียและไม่ต้องยุ่งกับมัน นั่นคือฉันขอแนะนำให้ผู้ใช้ลบการตั้งค่า gc-cons-threshold ใด ๆ จาก. emac ของพวกเขา "
izkon

1
@izkon ยกเว้นว่าโพสต์ที่คุณเชื่อมโยงกับวันที่กลับไปปี 2007 ในขณะที่เช่นโพสต์นี้ที่มีคนทดลองจริง - และการเปลี่ยนเกณฑ์ทำให้เกิดความแตกต่าง - ย้อนหลังไปถึงปี 2559 ดังนั้นมันจึงถดถอย ทำงานได้ดี
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'ing มันอาจใช้เวลานาน ฉันไม่แน่ใจว่า Eli หมายถึงอะไรอย่างแน่นอน 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.