मैं कई पैकेजों के बावजूद स्टार्टअप समय में सुधार कैसे कर सकता हूं?


19

TL; DR मेरे पास इतनी बड़ी मात्रा में पैकेज हैं कि यह मेरे स्टार्टअप समय को नुकसान पहुंचा रहा है। यदि आपको विश्वास नहीं है कि मामला हो सकता है, तो पढ़ें।


मेरा Emacs स्टार्टअप का समय काफी छोटा है। मैं उपयोग नहीं करता use-package, मैं बस हुक के टन सेट और autoloadइतना है कि लगभग सभी कोड स्थगित है। वास्तव में यह पूरी चीज आमतौर पर आधे सेकंड से भी कम समय में भरी हुई है, इसके बावजूद यह एक पागल गड़बड़ की तरह लग रहा है।

हालांकि, समय के साथ मैंने देखा कि मेरे स्टार्टअप समय को न्यूनतम रूप से धीमा, बेवजह मिलता है। यह अंततः उस बिंदु पर पहुंच गया है जहां स्टार्टअप का समय to 1 सेकंड है। आखिरकार मेरे पास पर्याप्त था और मैंने समस्या की जड़ में खोद दिया। मैंने अंततः अपनी पूरी ~/.emacsफ़ाइल को टिप्पणी की और पाया कि स्टार्टअप का समय अभी भी । 1 सेकंड था। वास्तव में, यह केवल ~ 0.2सेकंड से मुंडा था , कभी-कभी कम भी। फिर मैंने कोशिश की emacs -qऔर पाया कि स्टार्टअप का समय ~ 0.1सेकंड था ।

एलिफ़स मैनुअल के इस खंड की जाँच करने पर , मुझे पता चला कि emacs -qस्टार्टअप का समय इतना कम क्यों हो रहा है। जाहिर है emacs -qस्टार्टअप पर तीन बातें करने से Emacs बंद हो जाता है:

  1. अपनी init फ़ाइल लोड करना
  2. अपनी default.elफ़ाइल लोड कर रहा है
  3. बुला package-initialize

हमने अपनी इनिट फ़ाइल पहले ही खारिज कर दी है, क्योंकि मेरी पूरी टिप्पणी ~/.emacsलगभग कुछ भी नहीं है। मैं एक default.elफ़ाइल का उपयोग नहीं करता, इसलिए इसे भी खारिज कर दिया गया। जो package-initializeप्रदर्शन हिट के लिए अपराधी के रूप में निकल जाता है।

package-initializeइतना स्टार्टअप टाइम क्यों ले रहा होगा ? यह पहला सवाल था जो मैंने खुद से पूछा। मैं सब कुछ autoloading नहीं कर रहे हैं? सही है। लेकिन है कि ठीक समस्या है।

मुझे यह पोस्ट मिली, जो बताती है कि "एक्टीवेटिंग" पैकेज में ऑटोलॉड फाइल्स पढ़ना और लोड पाथ सेट करना होता है। यह स्पष्ट रूप से एक I / O दंड देता है जब आपके पास कई पैकेज होते हैं क्योंकि आपके पास पढ़ने के लिए कई ऑटोलैड फाइलें होती हैं और सेट करने के लिए कई रास्ते होते हैं। दुर्भाग्य से, इसके बिना, ऑटोलॉड्स के प्रबंधन का कार्य उपयोगकर्ता के हाथों में आता है। दूसरे शब्दों में, package.elऑटोलैड फ़ाइलों और रास्तों के लिए फाइलसिस्टम को क्रॉल किए बिना , मुझे यह प्रबंधित करना होगा कि जो स्वयं एक थकाऊ और त्रुटि वाली प्रक्रिया हो सकती है।

मैं उस सड़क से नीचे नहीं जाना पसंद करूंगा। वर्तमान में मेरे पास 116 पैकेज हैं, जिनमें से ELPA के 107 और 25 आश्रित हैं। मुझे यकीन है कि यह संख्या इतनी अधिक है कि मेरे प्रदर्शन को इतना खराब कर रही है। लेकिन मैं एक विचित्र स्थिति में हूं क्योंकि मैं अपना कोई भी पैकेज नहीं निकालना चाहता।

क्या मेरे लाइटनिंग स्टार्टअप समय को वापस पाने के लिए ऐसी स्थिति में कोई उपाय है?


अपडेट करें:

हमने इस समस्या को हल करने के लिए स्टीफन मोननियर (इन पैच का विवरण यहाँ है ) द्वारा कुछ पैच के बारे में मेलिंग सूची पर एक नया सूत्र शुरू किया है। किसी का भी स्वागत है उसका पैच टेस्ट करने और प्रतिक्रिया देने के लिए।emacs-devel

एक और अपडेट:

ऐसा लगता है कि स्टीफन मोननियर या तो इस मुद्दे में दिलचस्पी नहीं ले रहे हैं या उन्हें मेरे संदेश नहीं मिल रहे हैं। मैं पूर्व को मानने के लिए इच्छुक हूं, जो ठीक है, हालांकि अगर ऐसा है तो मैं उससे किसी तरह की प्रतिक्रिया की सराहना करूंगा। वैसे भी, इस मुद्दे के लिए उन्होंने अब तक जो कोड तैयार किया है वह काफी अच्छा काम करता है। उनके सबसे हाल के पैच यहां (Emacs 25.3 के लिए) और यहां (Emacs मास्टर शाखा के लिए ) पाए जा सकते हैं मैंने अपने स्टार्टअप समय पर उनके पैचेज़ की बदौलत अच्छे सुधार देखे हैं और मैं एक ऐसे बिंदु पर हूँ जहाँ मैं अपने स्टार्टअप समय के साथ सहज हूं कि यह मेरे अनुकूलन की सुविधाओं को काटे बिना जितना संभव हो उतना अनुकूलित हो। मैं उम्मीद कर रहा था कि ये पैच कुछ बिंदु पर इसे एमएसीएस मेनलाइन में बना देंगे, लेकिन मुझे लगता है कि मुझे (या किसी और) को स्टीफन के बजाय अब इसके लिए मशाल उठानी होगी। कॉपीराइट असाइनमेंट और लाइसेंसिंग के बारे में हमें मेलिंग लिस्ट में कुछ जगह नहीं मिली। ऐसा करने में मैं शुरू में असहज था, लेकिन रिचर्ड स्टालमैन और अन्य की कुछ टिप्पणियों के कारण, कॉपीराइट असाइनमेंट उतना प्रतिबंधात्मक नहीं हो सकता जितना मैंने मूल रूप से सोचा था। इसके अलावा, कॉपीराइट कार्य के विकल्प के रूप में सार्वजनिक क्षेत्र में अपने काम करना मेरे लिए संभव हो सकता है।

किसी भी मामले में, अब तक के पैच के लिए धन्यवाद स्टीफन! मुझे उम्मीद है कि आप इन परिवर्तनों को विकसित करना जारी रखेंगे, लेकिन यदि नहीं, तो यह ठीक है और मैं इसे किसी बिंदु पर विकसित करना जारी रख सकता हूं। मैं बाकी सभी को भी धन्यवाद देता हूं जिन्होंने इस मुद्दे को सुलझाने के लिए अंतर्दृष्टि और योगदान की पेशकश की।

फिर भी एक और अद्यतन:

वाह, यह सुविधा अंत में उतरा जैसा दिखता है और Emacs 27 में होगा। Stefan Monnier को धन्यवाद!


बड़ा सवाल है।
आकर्षित किया

use-packageइसके लिए जाने का रास्ता है।
डोडेगी

समस्या को कम करने की कोशिश नहीं कर रहा है (स्टार्टअप विलंबता महत्वपूर्ण है!), लेकिन Emacs को एक डेमन / सर्वर के रूप में चलाने पर विचार न करें ताकि आप केवल एक बार स्टार्टअप लागत के लिए भुगतान करें।
GMANNICKG

1
@GManNickG मैं Emacs को एक सर्वर के रूप में चलाता हूं। दुर्भाग्य से, हर अब और फिर मैं Emacs को बहुत कठिन या टिंकर के साथ बहुत अधिक धक्का देता हूं और चीजों को साफ करने के लिए एक पुनरारंभ सबसे अच्छा तरीका है। जब ऐसा होता है, तो मैं अपने स्टार्टअप समय को इष्टतम होना पसंद करता हूं।
जीडीपी 2

जवाबों:


13

Package.el में डिजाइन विकल्पों में से एक चीजों को "सरल" बनाने की कोशिश करना था। इसका हिस्सा यह है कि package-initializeस्थापित किए गए सभी पैकेजों की खोज करता है, फिर यह पता लगाने की कोशिश करता है कि उनमें से कौन सा सक्रिय होना चाहिए (पिनिंग के अनुसार और संस्करणों के पुनरावृत्ति के मामले में जहां एक ही पैकेज के कई संस्करण उपलब्ध हैं), फिर लोड करता है प्रत्येक सक्रिय पैकेज की <pkg>-autoloads.elफ़ाइल।

तो एन स्थापित पैकेज के लिए, इसका मतलब है कि मूल रूप से एन <pkg>-pkg.elपैकेज-विवरण फाइलें और एन <pkg>-autoloads.elफाइलें पढ़ना । बड़ी एनएस के लिए, यह एक गंभीर समस्या बन सकती है। एक और संभावित प्रदर्शन मुद्दा यह है कि यह एन तत्वों को जोड़ देगा load-path, इसलिए हर बार जब आप loadएमएसीएस एन निर्देशिकाओं के माध्यम से खोज करेंगे, तो प्रत्येक 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 बहुत तेज़ होगा । यदि आप इसे आज़माने में रुचि रखते हैं, तो मुझसे मदद के लिए स्वतंत्र महसूस करें।

एफडब्ल्यूआईडब्ल्यू, मैंने अपने परीक्षण सेटअप पर "हाथ से" ऐसी मेगा-ऑटोलॉड्स फ़ाइल बनाने की कोशिश की है। परिणाम: जबकि package-initialize0.9 के बारे में लेता है, mega-autoloads.elफ़ाइल को लोड करने में 0.3s लगते हैं, जिसे मैं 0.2-नील्स को नी -बाइंडिंग द्वारा load-source-file-functionशून्य पर ला सकता हूं , और फाइल को बाइट संकलित करके 0.1s पर ला सकता हूं । मुझे उम्मीद थी कि ईमानदार होने के लिए बेहतर गति होगी, लेकिन यह अभी भी सार्थक है।

[संपादित करें] यह "मेगा ऑटोलॉड्स" दृष्टिकोण अब एमएसीएस की मास्टर शाखा (कुछ दूर के भविष्य में एमएसीएस -27 बनने के लिए) में उपलब्ध है। यह नए package-quickstartचर द्वारा नियंत्रित किया जाता है।


वे कुछ बहुत ही दिलचस्प विचार हैं। पहले वाले को अधिक डाउन-टू-अर्थ लगता है और एक चुनौती कम। दूसरा एक काफी दिलचस्प है, लेकिन यह package.elडेवलपर्स के लिए एक नौकरी जैसा लगता है। उस पहले विकल्प के साथ शुरुआत करने पर आपके पास किस तरह की सलाह है? मैं यह देखना चाहता हूं कि मैं इसके साथ क्या कर सकता हूं, क्योंकि यह अधिक व्यावहारिक लगता है।
जीडीपी 2

el-get सिंगल ऑटोलॉड्स फ़ाइल दृष्टिकोण का उपयोग करता है, यह मूल रूप से अधिकांश समय काम करता है। कुछ पैकेजों से परेशानी होती है जिनके ऑटोलॉड्स उस फाइल सिस्टम के स्थान पर निर्भर करते हैं, जिसमें उनका मूल्यांकन किया जाता है। मैं "सही क्रम में" से आपका मतलब नहीं मानता, हालांकि, ऑटोलैड लोडिंग ऑर्डर कभी भी क्यों नहीं होगा (मैंने नहीं किया था) लगता है कि यह मौजूदा package.el के लिए भी नियतात्मक था)?
npostavs

@Stefan कृपया समाधान यहाँ साझा करें, यदि संभव हो तो।
मैनुअल उबरती

1
@npostavs: ज्यादातर <pkg>-autoloads.elफाइलें केवल ऑटोलॉड्स सेटअप करती हैं और वास्तव में ऑर्डर करने के बारे में परवाह नहीं करती हैं, लेकिन उन्हें यादृच्छिक अन्य चीजों को करने से रोकती है, और package.el गारंटी देता है कि जिस पैकेज पर <pkg>निर्भर करता है वह <pkg>खुद से पहले सक्रिय हो जाएगा ।
स्टीफन

1
इस मुद्दे पर एक और अपडेट: हमने यहां मेलिंग सूची पर एक नया विषय शुरू किया है और कोई भी स्टीफन के परिवर्तनों पर टिप्पणी करने या परीक्षण करने के लिए स्वतंत्र है।
जीडीपी 2

6

package-initializeलोड करने के लिए इतना समय लेने के बारे में आप जिस समस्या का वर्णन करते हैं वह एक जानी-मानी समस्या है। यह भी समस्याओं में से एक है कि कुछ एमएसीएस ढांचे ऑटोलोड्स को मैन्युअल रूप से लोड करके हल करने का प्रयास करते हैं।

मैं आपकी समस्या के दो समाधान देखता हूं।

  1. पथों को सेट करने और उन पैकेजों के ऑटोलोड को लोड करने के लिए कार्यक्षमता लिखें (या निकालें) जिनसे आप रुचि रखते हैं।
  2. एक फ्रेमवर्क का उपयोग करें जो स्पष्ट रूप से गति को लक्षित करता है। मैं व्यक्तिगत रूप से DOOM emacs की सिफारिश करता हूं । इस ढांचे के साथ, मैं लगभग 1 सेकंड में 200 से अधिक पैकेट लोड कर रहा हूं।

डीओएम एमएसीएस की सिफारिश करने के लिए एक मुख्य प्रतिध्वनि यह है कि ढांचा एमएसीएस के बाहर पैकेज प्रबंधन करता है। मुझे गलत मत समझो, यह अभी भी emacs है जो पैकेज प्रबंधन कर रहा है, यह सिर्फ इतना है कि संकुल प्रबंधन एक मानक उपयोगकर्ता सत्र के बाहर किया जाता है। यहां दर्शन यह है: जब आम तौर पर emacs शुरू करते हैं, तो हमें यह मान लेना चाहिए कि सभी पैकेज मौजूद हैं और पहले से ही लोड किए जा सकते हैं। इससे काफी समय की बचत होती है। डीओएम एमएसीएस एमएसीएस के समतुल्य apt-getया समरूप प्रदान करता है pacman। एक बार एक पैकेज स्थापित किया जाता है, जब भी emacs शुरू होता है यह पहले से ही स्थापित माना जाता है; कोई सवाल नहीं पूछा।


आश्चर्य है, यह जानकर खुशी हुई कि यह मुद्दा केवल मुझे प्रभावित नहीं कर रहा है। मुझे डूम एमएसीएस की ओर इशारा करने के लिए धन्यवाद। मुझे इसके बारे में बारीकी से जानकारी लेनी होगी और देखना होगा कि मैं अपने सेटअप में क्या बदलाव ला सकता हूं।
जीडीपी 2

मैं कुछ समय के लिए डीओएम ईमैक्स (और जब मैं कर सकता हूं) योगदान कर रहा हूं। यदि आपको समस्या हो रही है, तो मुझसे संपर्क करने में संकोच न करें।
अंडरडर्नबर्न
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.