ฉันจะปรับปรุงเวลาเริ่มต้นได้อย่างไรแม้จะมีหลายแพ็คเกจ


19

TL; DRฉันมีแพคเกจจำนวนมากเช่นนี้ซึ่งทำให้เจ็บเวลาเริ่มต้นของฉัน หากคุณไม่เชื่อว่าเป็นเช่นนั้นอ่านต่อ


เวลาเริ่มต้น Emacs ของฉันค่อนข้างเล็ก ฉันไม่ได้ใช้use-packageฉันเพิ่งตั้ง hooks และautoloads หลาย ๆ ตัวเพื่อให้โค้ดเกือบทั้งหมดถูกเลื่อนออกไป ในความเป็นจริงสิ่งต่าง ๆ ถูกโหลดโดยปกติแล้วจะน้อยกว่าครึ่งวินาทีแม้ว่ามันจะดูเหมือนเป็นบ้าก็ตาม

แต่เมื่อเวลาผ่านไปผมสังเกตเห็นว่าเวลาเริ่มต้นของฉันได้รับพิถีพิถันช้าลงอย่างลึกลับ สิ่งนี้ได้มาถึงจุดที่เวลาเริ่มต้นคือ≥ 1 วินาที ในที่สุดฉันก็มีเพียงพอและขุดลงไปในรากของปัญหา ในที่สุดฉันก็แสดงความคิดเห็น~/.emacsไฟล์ทั้งหมดของฉันและพบว่าเวลาเริ่มต้นยังคงเป็น≥ 1 วินาที อันที่จริงแล้วมันก็แค่โกนออก ~ 0.2วินาทีบางครั้งก็น้อยลง จากนั้นฉันลองemacs -qและพบว่าเวลาเริ่มต้นคือ ~ 0.1วินาที

จากการตรวจสอบในส่วนของคู่มือ Elisp นี้ฉันพบว่าทำไมemacs -qลดเวลาในการเริ่มต้นให้มาก เห็นได้ชัดว่าemacs -qหยุด Emacs จากการทำสามสิ่งเมื่อเริ่มต้น:

  1. โหลดไฟล์ init ของคุณ
  2. กำลังโหลดdefault.elไฟล์ของคุณ
  3. โทร package-initialize

เราได้ตัดออกไฟล์ init ของฉันแล้วเนื่องจากการแสดงความคิดเห็นทั้งหมดของฉัน~/.emacsไม่ได้ทำอะไรเลย ฉันไม่ได้ใช้default.elไฟล์เพื่อตัดออกไป ซึ่งปล่อยpackage-initializeให้เป็นผู้กระทำความผิดสำหรับการแสดงยอดฮิต

เหตุใดจึงpackage-initializeต้องสละเวลาเริ่มต้นมาก นั่นเป็นคำถามแรกที่ฉันถามตัวเอง ฉันไม่ได้โหลดทุกอย่างอัตโนมัติหรือ ก็ใช่ แต่นั่นเป็นปัญหาที่แม่นยำ

ฉันพบโพสต์นี้ซึ่งอธิบายว่า "การเปิดใช้งาน" แพ็คเกจประกอบด้วยการอ่านไฟล์ autoload และการตั้งค่าโหลดพา ธ สิ่งนี้เห็นได้ชัดว่าเป็นการลงโทษ I / O เมื่อคุณมีแพ็กเกจมากมายเนื่องจากคุณมีไฟล์ autoload จำนวนมากที่จะอ่านและเส้นทางมากมายที่จะตั้งค่า น่าเสียดายที่ไม่มีสิ่งนี้หน้าที่ในการจัดการ autoloads จะตกไปอยู่ในมือของผู้ใช้ กล่าวอีกนัยหนึ่งโดยไม่ปล่อยให้package.elระบบไฟล์รวบรวมข้อมูลไฟล์และพา ธ อัตโนมัติฉันจะต้องจัดการตัวเองซึ่งอาจเป็นกระบวนการที่น่าเบื่อและผิดพลาดได้ง่าย

ฉันไม่อยากลงไปที่ถนนเส้นนั้น ปัจจุบันฉันมี 116 แพคเกจโดยมี 107 รายการจาก ELPA และ 25 รายการซึ่งเป็นการอ้างอิง ฉันแน่ใจว่าหมายเลขมหันต์นี้เป็นสิ่งที่ทำให้การแสดงของฉันแย่ลงมาก แต่ฉันไม่แน่ใจเพราะฉันไม่ต้องการลบแพ็คเกจใด ๆ ของฉัน

มีวิธีแก้ไขในสถานการณ์เช่นนี้เพื่อให้เวลาในการเริ่มต้นฟ้าผ่ากลับคืนมาหรือไม่?


ปรับปรุง:

เราได้เริ่มต้นหัวข้อใหม่ในemacs-develรายการจดหมายเกี่ยวกับบางส่วน แพทช์โดยสเตฟาน Monnier (คำอธิบายของแพทช์เหล่านี้คือที่นี่ ) เพื่อแก้ปัญหานี้ ทุกคนยินดีที่จะทดสอบแพทช์ของเขาและให้ข้อเสนอแนะ

การปรับปรุงอื่น:

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

ไม่ว่าในกรณีใด ๆ ขอบคุณ Stefan สำหรับแพทช์จนถึงตอนนี้! ฉันหวังว่าคุณจะพัฒนาการเปลี่ยนแปลงเหล่านี้ต่อไป แต่ถ้าไม่เป็นเช่นนั้นก็ไม่เป็นไรและฉันอาจพัฒนาต่อไปในบางจุด ฉันขอขอบคุณทุกคนที่เสนอข้อมูลเชิงลึกและการมีส่วนร่วมในการแก้ไขปัญหานี้

ยังมีการอัพเดทอื่น:

ว้าวดูเหมือนว่าคุณสมบัตินี้จะมาถึงในที่สุดและจะอยู่ใน Emacs 27 ขอบคุณ Stefan Monnier!


เป็นคำถามที่ดีมาก
ดึง

use-packageเป็นวิธีที่จะไปสำหรับสิ่งนี้
Dodgie

ไม่พยายามดาวน์โหลมปัญหา (เวลาแฝงในการเริ่มต้นสำคัญ!) แต่ให้พิจารณาใช้ emacs เป็น daemon / เซิร์ฟเวอร์ดังนั้นคุณจะจ่ายเฉพาะค่าเริ่มต้นเพียงครั้งเดียว
GManNickG

1
@GManNickG ฉันรัน Emacs เป็นเซิร์ฟเวอร์ น่าเสียดายที่ตอนนี้ฉันดัน Emacs แรงเกินไปหรือคนจรจัดมากเกินไปและการรีสตาร์ทเป็นวิธีที่ดีที่สุดในการล้างสิ่งต่างๆ เมื่อสิ่งนั้นเกิดขึ้นฉันชอบเวลาเริ่มต้นที่ดีที่สุด
GDP2

คำตอบ:


13

หนึ่งในตัวเลือกการออกแบบใน package.el คือการลองทำสิ่งที่ "ง่าย" ส่วนหนึ่งของสิ่งนี้คือpackage-initializeการค้นหาแพ็คเกจทั้งหมดที่ติดตั้งจากนั้นพยายามคิดว่าควรเปิดใช้งานแพ็คเกจใดของแพ็กเกจเหล่านั้น (ตามการปักหมุดและความใหม่ของรุ่นในกรณีที่มีแพ็คเกจรุ่นเดียวกันหลายชุด) จากนั้นโหลด แต่ละ<pkg>-autoloads.elไฟล์ของแพ็คเกจที่เปิดใช้งาน

ดังนั้นสำหรับแพ็คเกจที่ติดตั้ง N นั่นหมายความว่าโดยทั่วไปแล้วจะอ่าน<pkg>-pkg.elไฟล์คำอธิบายแพ็กเกจ N และ<pkg>-autoloads.elไฟล์N สำหรับ Ns ขนาดใหญ่ที่สามารถกลายเป็นปัญหาร้ายแรง ปัญหาประสิทธิภาพการทำงานที่อาจเกิดขึ้นอีกอย่างหนึ่งก็คือมันจะเพิ่มองค์ประกอบ N เข้าไปload-pathดังนั้นทุกครั้งที่คุณloadEmacs จะค้นหาผ่านไดเรกทอรี N ดังนั้นแต่ละอันloadจะช้าลง

มีหลายวิธีที่เราสามารถลองและเร่งความเร็วได้:

  • จัดเตรียมวิธีในการคำนวณ~/.emacs.d/elpa/package-initialize.el(c)ไฟล์ล่วงหน้าซึ่งจะเป็นผลลัพธ์ของการเชื่อมโยงสิทธิ์ทั้งหมด<pkg>-autoloads.elในลำดับที่ถูกต้อง จากนั้นก็package-initializeสามารถโหลดไฟล์นี้เมื่อมีและข้ามทุกอย่างอื่น แล้วคุณจะต้องมีวิธีที่จะฟื้นฟู / ล้างบางpackage-initialize.el(c)ไฟล์เมื่อแพคเกจที่มีการเพิ่ม / การปรับปรุง / ลบออกหรือเมื่อคุณเปลี่ยนของคุณหรือของคุณpackage-pinned-packages package-load-listฉันคิดว่าสิ่งนี้สามารถทำได้ด้วยการเปลี่ยนแปลงเล็กน้อยในระบบ (สิ่งเดียวที่จะต้องมีการเปลี่ยนแปลงจริง ๆ ฉันคิดpackage-initializeว่ามันสามารถบอกได้ว่า "เปิดใช้งานเท่านั้น" โดยไม่ต้องโหลดเมตาดาต้า

  • จัดเตรียมวิธีในการสร้าง / จัดการซุปเปอร์แพคเกจเช่นแพ็คเกจที่รวมหลายแพ็คเกจไว้ในที่เดียว (ดังนั้นจึงมีเพียงองค์ประกอบเดียวที่เพิ่มเข้าไปload-pathหนึ่ง<pkg>-pkg.elและหนึ่ง<pkg>-autoloads.elโหลด) สิ่งนี้อาจทำให้ยากขึ้น (เพราะคุณไม่สามารถเปิดใช้งานส่วนหนึ่งของแพ็คเกจที่บรรจุอยู่ในแพ็คเกจพิเศษดังกล่าวได้เท่านั้นดังนั้นการวิเคราะห์การพึ่งพา / รุ่นอาจมีความยุ่งยาก)

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

FWIW ฉันเพิ่งพยายามสร้างไฟล์ mega-autoloads เช่น "ด้วยมือ" ในการตั้งค่าการทดสอบของฉัน ผลลัพธ์: ขณะที่package-initializeใช้เวลาประมาณ 0.9 วินาทีการโหลดmega-autoloads.elไฟล์ใช้เวลา 0.3 วินาทีซึ่งฉันสามารถลดระดับลงได้ถึง 0.2 วินาทีโดยให้การเชื่อมโยงload-source-file-functionกับศูนย์และอีก0.1 วินาทีโดยการคอมไพล์ไฟล์ ฉันคาดหวังว่าจะได้ความเร็วที่ดีกว่าเดิม แต่ก็ยังคุ้ม

[แก้ไข] วิธีการ "mega autoloads" นี้มีวางจำหน่ายแล้วในสาขาหลักของ Emacs (เพื่อเป็น Emacs-27 ในอนาคตอันไกล) มันถูกควบคุมโดยpackage-quickstartตัวแปรใหม่


นี่เป็นแนวคิดที่น่าสนใจ คนแรกฟังมากขึ้นสู่พื้นโลกและน้อยกว่าความท้าทาย อันที่สองนั้นค่อนข้างน่าสนใจ แต่ฟังดูเหมือนเป็นงานของpackage.elนักพัฒนา คุณมีคำแนะนำแบบไหนเมื่อเริ่มจากตัวเลือกแรกนั้น? ฉันต้องการที่จะเห็นสิ่งที่ฉันสามารถใช้ค้อนกับมันเพราะมันดูเหมือนจะทำงานได้มากขึ้น
GDP2

el-get ใช้วิธีการโหลดไฟล์ autoloads เพียงวิธีเดียวโดยทั่วไปแล้วจะใช้เวลาส่วนใหญ่ มีปัญหากับแพคเกจบางอย่างที่มีการโหลดอัตโนมัติขึ้นอยู่กับตำแหน่งในระบบไฟล์ที่พวกเขาได้รับการประเมินฉันไม่ทำตามที่คุณหมายถึงโดย "ในลำดับที่ถูกต้อง" แม้ว่าทำไมคำสั่งของการโหลดอัตโนมัติไม่สำคัญ คิดว่ามันถูกกำหนดไว้แล้วสำหรับแพ็คเกจปัจจุบัน el)?
npostavs

@Stefan โปรดแบ่งปันวิธีแก้ปัญหาที่นี่ถ้าเป็นไปได้
Manuel Uberti

1
@npostavs: <pkg>-autoloads.elไฟล์ส่วนใหญ่ตั้งค่า autoloads โดยเฉพาะและไม่สนใจการสั่งซื้อ แต่ไม่มีสิ่งใดที่ขัดขวางพวกเขาในการทำสิ่งอื่น ๆ แบบสุ่มและ package.el รับประกันได้ว่าแพ็กเกจที่<pkg>ขึ้นอยู่จะเปิดใช้งานก่อนหน้า<pkg>ตัวเอง
Stefan

1
อัปเดตเกี่ยวกับปัญหานี้อีก: เราได้เริ่มหัวข้อใหม่ในรายชื่อผู้รับจดหมายที่นี่และทุกคนสามารถแสดงความคิดเห็นหรือทดสอบการเปลี่ยนแปลงของ Stefan ได้ฟรี
GDP2

6

ปัญหาที่คุณอธิบายเกี่ยวกับpackage-initializeการใช้เวลาในการโหลดนานเกินไปเป็นปัญหาที่รู้จักกันดี มันเป็นหนึ่งในปัญหาที่เฟรมเวิร์ก emacs บางอันพยายามแก้ไขด้วยการโหลด autoloads ด้วยตนเอง

ฉันเห็นสองวิธีแก้ไขปัญหาของคุณ

  1. เขียน (หรือแยกจากเฟรมเวิร์ก) ฟังก์ชันการทำงานเพื่อตั้งค่าพา ธ และโหลด autoloads ของแพ็คเกจที่คุณสนใจ
  2. ใช้เฟรมเวิร์กที่กำหนดเป้าหมายความเร็วอย่างชัดเจน ผมเองขอแนะนำemacs DOOM ด้วยเฟรมเวิร์กนี้ฉันกำลังโหลดมากกว่า 200 แพ็คเก็ตในเวลาประมาณ 1 วินาที

หนึ่งใน resons หลักสำหรับการแนะนำ emac DOOM คือกรอบที่ทำให้การจัดการแพคเกจนอก emacs อย่าตีความผิดฉันมันยังคง emacs ที่กำลังทำการจัดการแพ็คเกจเป็นเพียงแค่การจัดการแพ็คเกจที่ทำนอกเซสชันผู้ใช้มาตรฐาน ปรัชญาที่นี่คือ: เมื่อเริ่มต้นโดยปกติ emacs เราควรจะสามารถสันนิษฐานได้ว่าแพคเกจทั้งหมดมีอยู่และสามารถโหลดได้แล้ว สิ่งนี้ช่วยประหยัดเวลาได้มาก ดูม emacs จัดเรียงเทียบเท่าapt-getหรือpacmanemacs เมื่อมีการติดตั้งแพคเกจเมื่อใดก็ตามที่ emacs เริ่มก็จะถือว่าติดตั้งแล้ว; ไม่มีคำถามถาม


ว้าดีใจที่รู้ว่าปัญหานี้ไม่เพียงส่งผลกระทบต่อฉันเท่านั้น ขอบคุณที่ชี้นำฉันไปสู่ ​​DOOM Emacs ฉันจะต้องดูให้ละเอียดยิ่งขึ้นและดูว่าฉันสามารถปรับตัวเข้ากับการตั้งค่าของฉันเองได้อย่างไร
GDP2

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