ฉันจะทำอย่างไรเพื่อเร่งความเร็วการเริ่มต้นใช้งาน


41

ฉันสามารถทำสิ่งพื้นฐานบางอย่างเพื่อลดเวลาเริ่มต้นได้อย่างไร

มีสิ่งใดที่ฉันควรให้ความสนใจเป็นพิเศษ

หมายเหตุ: เวลาเริ่มต้นสามารถลดลงได้โดยการเริ่มต้น Emacs น้อยลง (หนึ่งครั้งต่อเซสชัน) และการเปิดไฟล์ในอินสแตนซ์ที่กำลังทำงานอยู่ คำถามนี้เกี่ยวกับการลดเวลาเริ่มต้นให้น้อยที่สุดสำหรับการเริ่มเซสชันหรือเวลาอื่น ๆ เมื่อจำเป็นต้องเริ่มต้น Emacs


ดูคำถามเดียวกันที่ได้รับการตอบใน Stack Overflow พร้อมกับคำถามและคำตอบคะแนนมากกว่าบุ๊คมาร์ค "ที่ชื่นชอบ" กว่า 50 และ 30 คำตอบที่ดีที่นี่ควรเป็นมากกว่าสิ่งที่มีอยู่ใน Stack Overflow


1
ฉันชอบที่จะมีข้อมูลเกี่ยวกับเรื่องนี้ แต่ฉันเดาว่าสำหรับผู้ใช้ส่วนใหญ่มีหนึ่งหรือสองแพ็คเกจที่ทำสำหรับเวลาเริ่มต้นจำนวนมาก ในกรณีของฉันมันเป็นหางเสือ โปรดทราบว่าหากคุณใช้หางเสือคุณไม่สามารถเลื่อนการเริ่มต้นได้จริง ๆ คุณต้องการให้มันพร้อมใช้งานทันที ฉันเปลี่ยนเป็นไม้เลื้อยและนั่นทำให้เวลาเริ่มต้นของฉันลดลงจากประมาณ 12 วินาทีเหลือน้อยกว่าหนึ่งวินาที ฉันยังหยุดใช้การตั้งค่าเซิร์ฟเวอร์ / ไคลเอนต์ (โดยวิธีการที่ผมไม่ได้เปลี่ยนเพื่อลดเวลาในการเริ่มต้นที่เป็นเพียงประโยชน์ด้านดี.)
โอมาร์

คำตอบ:


43

นี่คือประเด็นของฉันเกี่ยวกับการลดลงemacs-init-timeซึ่งไม่ครอบคลุมสิ่งต่าง ๆ เช่นการใช้ daemon หรือเซิร์ฟเวอร์โดยไม่บอกว่าคุณควรปิด emacs บ่อยครั้ง

ไม่ได้:

  • ไม่ต้องการแพ็คเกจใน init ของคุณหากแพ็คเกจไม่มีคุกกี้ autoload ที่เหมาะสมตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่า autoloads บนคำสั่งการป้อนข้อมูล ดังนั้นหากครั้งแรกที่คุณใช้แพ็กเกจfoobarจะเป็นการโทรfoobar-modeและfoobarไม่ได้โหลดอัตโนมัติล่วงหน้าคุณจะต้องมีอะไรเช่นนี้:

    (autoload 'foobar-mode "foobar")
    

    สิ่งนี้จะช่วยให้คุณสามารถโทรfoobar-modeได้แม้จะfoobarยังไม่ได้โหลดแพ็คเกจ วิธีนี้foobarจะไม่โหลดจนกว่าคุณจะโทรจริงfoobar-mode

  • อย่าทำงานpackage-refresh-contentsหากคุณไม่จำเป็นต้องติดตั้งแพ็คเกจเมื่อเริ่มต้น หากคุณกำลังตั้งค่าให้ติดตั้งแพ็คเก็ตที่ขาดหายไปโดยอัตโนมัติให้พิจารณาตั้งค่าบรรทัดคำสั่งเพื่อให้คุณระบุว่าควรจะติดตั้งอัตโนมัติเมื่อใด

  • อย่าทำเครือข่ายใด ๆ ที่เกี่ยวข้อง
  • อย่าโหลดของคุณdesktopบน init เว้นแต่คุณจะต้องการจริงๆ

ทำ

  • ใช้สิ่งที่ต้องการuse-packageจัดการแพ็คเกจของคุณ สิ่งนี้ทำให้ง่ายต่อการระบุสิ่งที่ต้องการสิ่งที่จะโหลดในภายหลังสิ่งที่โหลดอัตโนมัติอะไรและทำให้การทำโปรไฟล์ init ของคุณบนแพ็คเกจตามแพคเกจง่าย

  • รู้ถึงความแตกต่างระหว่างการโหลดธีมและเปิดใช้งาน ในระยะสั้นคุณสามารถโหลดได้มากเท่าที่คุณต้องการ แต่ให้แน่ใจว่าคุณไม่ได้เปิดใช้งานมากกว่าหนึ่ง เป็นการดีที่โหลดเท่านั้นและเปิดใช้งานหนึ่งชุดรูปแบบ load-themeต้องการ arg ที่เป็นตัวเลือกเพื่อป้องกันการเปิดใช้งานของธีม มันอาจเป็นเรื่องง่ายที่จะเปิดใช้งานหลายรูปแบบโดยไม่ตั้งใจซึ่งช้าและน่าเกลียดในระหว่างการเริ่มต้น

  • อย่าโกง: มักจะมีโหมดระดับโลกขนาดใหญ่ที่คุณต้องการโหลดใน init สิ่งต่าง ๆ เช่นเลิกทำต้นไม้เติมข้อความอัตโนมัติโหมด ido ฯลฯ ให้แน่ใจว่าฟังก์ชั่นการป้อนข้อมูลมีการตั้งค่า autoloads จากนั้นเริ่มตัวจับเวลาว่างใน init เพื่อโหลดแพ็คเกจ . ฉันทำนี้จะundo-tree-mode, idoและคนอื่น ๆ และไม่เคยสังเกตเห็นความล่าช้าเพราะตามเวลาที่จริงผมจำเป็นต้องใช้พวกเขาพวกเขาจะเต็มไปแล้ว

    อัปเดต: use-package เปลี่ยนไปเล็กน้อยอ่าน readme อย่างเป็นทางการก่อนที่คุณจะเริ่มใช้คุณสมบัติตัวจับเวลา

    ตัวอย่างเช่น: หากคุณต้องการชะลอการโหลดเล็กน้อยglobal-undo-tree-modeคุณสามารถใส่สิ่งนี้ใน init ของคุณ:

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

    ตอนนี้ผู้ประทับจิตของคุณสามารถดำเนินการต่อได้อย่างมีความสุขและ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เป็นเครื่องมือที่ยอดเยี่ยมที่ฉันใช้เพื่อช่วยให้ฉันลดขนาด init จาก ~ 6 วินาทีเป็น <1 วินาที

การกำหนดค่าuse-packageเริ่มต้นที่ดีสามารถทำได้อย่างรวดเร็วอย่างไม่น่าเชื่อ ฉันไม่ได้คอมไพล์ init ของฉันและมันใช้use-packageเพื่อกำหนดค่า 95 แพ็คเกจและเริ่มทำงานใน <1 วินาที


7
"ทำโปรไฟล์ init ของคุณมันน่าแปลกใจเสมอที่เห็นว่าการชะลอตัวจริงนั้นอยู่ที่ไหน" สปอยเลอร์แจ้งเตือนมันเป็น(require 'org)บรรทัดนั้น :-)
Malabarba

@Jordan คุณช่วยเพิ่มความมั่นใจได้อย่างไรว่าฟังก์ชั่นการป้อนข้อมูลมีการตั้งค่าการโหลดอัตโนมัติจากนั้นเริ่มตัวจับเวลาว่างใน init เพื่อโหลดแพ็กเกจโดยเฉพาะอย่างยิ่งสำหรับโหมดเลิกทำต้นไม้? ขอบคุณ
Francisco Dibar

@FranciscoDibar ฉันได้อัปเดตโพสต์ด้วยตัวอย่าง
Jordon Biondo

2
ฉันใช้โหมด ido ทันที Cx Cf หรือ Mx สำหรับ smex เป็นสิ่งแรกที่ฉันเกือบจะตลอดเวลาเมื่อฉันเปิด emacs และฉันไม่เคยสังเกตเห็นปัญหาใด ๆ นอกจากนี้หากคุณต้องการยกเลิกบางอย่างภายในไม่กี่วินาทีในการเปิด emacs ... ฉันไม่มีอะไรจะพูดเกี่ยวกับเรื่องนี้ หากคุณเป็นกังวลจริง ๆ ลองด้วยตัวคุณเองหรือเพียงแค่ใช้ตัวจับเวลาที่ไม่ได้ใช้งานหรือหลังจากเริ่มตะขอ
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 คำสั่ง # '`
Andrew Swann

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) อาจจะสูงกว่าที่คุณต้องการ (ฉันไม่เห็นความแตกต่างกับหนึ่งในสิบของสิ่งนั้น); และ (b) ไม่ใช่ค่าที่คุณต้องการยืนยันอย่างชัดเจนนอกเหนือจากการเริ่มต้นเนื่องจากเกณฑ์ GC ขนาดใหญ่เท่ากับความล่าช้าอีกต่อไปเมื่อใดก็ตามที่ GC เกิดขึ้น หากคุณตั้งค่าไว้สูงสำหรับ init ให้ตั้งค่าให้ต่ำลงอีกครั้งหลังจาก init ฉันคิดว่าemacs-startup-hookเป็นสถานที่ที่ดีในการทำเช่นนั้น
Phils

1
@phils ขอบคุณ! (a) ในการตั้งค่าของฉัน 50Mb ให้จำนวน GCs น้อยที่สุด (และเวลาเริ่มต้นที่น้อยที่สุด) ถ้าฉันไปต่ำถึง 10Mb ความแตกต่างนั้นสามารถสังเกตเห็นได้ / สามารถวัดได้ (แม้ว่ามันจะไม่ได้เปลี่ยนแปลงในทางปฏิบัติมากนัก ... ) (b) ความคิดที่ดีขอบคุณ ฉันแก้ไขโพสต์เพื่อแสดงความคิดเห็นของคุณ
ffevotte

6

เวลาที่คุณใช้เพิ่มประสิทธิภาพเวลาเริ่มต้นของคุณน่าจะมากกว่าเวลาพิเศษทั้งหมดที่คุณรอคอยให้ Emacs เริ่มต้น

ในขณะนี้ฉันทำการrequireโทร25 ครั้งในไฟล์ init เพื่อให้ 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)'มีของreal 0m0.404sระยะเวลาสูงสุดทางทฤษฎีที่ฉันสามารถบันทึกได้คือ 2.3 วินาที

บอกว่าฉันใช้เวลาหนึ่งชั่วโมงในการปรับแต่งให้เหมาะสมกับไฟล์ init ของฉัน (ฉันจะไม่นับเพิ่มอีก 15-30 นาทีที่ใช้ในภายหลังพยายามคิดว่าทำไมการเปลี่ยนแปลงของฉันไม่มีผลเนื่องจากไฟล์ init ของฉันถูกคอมไพล์ด้วยไบต์) (ฉันจะไม่นับเวลาที่ Flycheck จะช่วยฉันใน debugger ถ้าฉันไม่ได้ลบการrequireโทร) มี 3600 วินาทีในหนึ่งชั่วโมงดังนั้นถ้าฉันจัดการเพื่อบันทึกทั้ง 2.3 วินาทีการลงทุนของฉันในเวลาจะจ่ายออกหลังจากที่เพิ่งเริ่มต้น 1565

สมมติว่าฉันรีสตาร์ท Emacs วันละ 3 ครั้งทุกวันมันจะใช้เวลาหนึ่งปีครึ่งในการลงทุน หากฉันออกจากอินสแตนซ์ Emacs เดิม ๆ ที่ใช้งานวันละครั้ง (อย่างที่ฉันทำบ่อยครั้ง) ฉันอาจรีสตาร์ทเพียง 2-5 ครั้งต่อสัปดาห์ซึ่งในกรณีนี้ใช้เวลา 6 ถึง 15 ปีในการลงทุน

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


12
แต่คุณอาจจะมีความสุขกว่า
phils

2
นั่นอาจเป็นจริงสำหรับหนึ่งคน แต่จุดทั้งหมดของ StackExchange นั้นเกี่ยวกับการแบ่งปัน มีเคล็ดลับอะไรบ้างที่ใช้เวลา 30 นาทีในการค้นหาบุคคลหนึ่ง แต่โกน 1 วินาทีจากเวลาเริ่มต้นของคนหลายสิบคน คุณจะยังคงพิจารณาว่าเป็นการลงทุนที่ไม่ดีหรือไม่?
ffevotte

@phils แดกดันฉันคิดว่าพูดในสิ่งเดียวกัน แต่เพื่อสนับสนุนมุมมองของตัวเอง! "ก่อนที่คุณจะคร่ำครวญเกี่ยวกับเวลาเริ่มต้นของคุณคิดกับตัวเองว่า 'ฉันดีใจที่ฉันไม่ได้เสียเวลาในการปรับให้เหมาะกับสิ่งนี้!'"
Jackson

@ Francesco และโพสต์นี้เป็นเคล็ดลับของฉันที่ช่วยประหยัดเวลาหลายสิบคน
แจ็กสัน

@ แจ็คสันฉันยังไม่เห็นด้วยกับคุณในประเด็นนี้โดยเฉพาะ แต่อย่างน้อยตอนนี้ฉันเห็นประเด็นของคุณแล้ว ขอบคุณ :)
ffevotte
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.