अपने स्टार्ट-अप को गति देने के लिए मैं क्या कर सकता हूं?


41

स्टार्ट-अप समय को कम करने के लिए मैं कुछ बुनियादी चीजें क्या कर सकता हूं?

क्या विशेष रूप से मुझे इस बात पर ध्यान देना चाहिए?

नोट: कम समय (एक बार प्रति सत्र) शुरू करने और एक चल उदाहरण में फ़ाइलों को खोलने से स्टार्टअप समय को कम किया जा सकता है । यह प्रश्न स्टार्टअप समय को कम करने के बारे में है, सत्र प्रारंभ या किसी अन्य समय के लिए जब Emacs शुरू करना आवश्यक है।


50 और 30 से अधिक "पसंदीदा" बुकमार्क के साथ सवाल और जवाब स्कोर के साथ, स्टैक ओवरफ्लो पर भी वही प्रश्न देखें । यहां अच्छे उत्तर स्टैक ओवरफ्लो पर उपलब्ध होने से परे जाना चाहिए।


1
मुझे इस पर डेटा देना पसंद है, लेकिन मेरा अनुमान है कि अधिकांश उपयोगकर्ताओं के लिए एक या दो पैकेज हैं जो स्टार्टअप समय के थोक के लिए बनाता है। मेरे मामले में यह पतवार थी। ध्यान दें कि यदि आप पतवार का उपयोग करते हैं तो आप वास्तव में इसके आरंभीकरण को स्थगित नहीं कर सकते, आप इसे तुरंत उपयोग करने के लिए तैयार करना चाहते हैं। मैंने आइवी पर स्विच किया और इसने मेरे प्रारंभ के समय को लगभग 12 सेकंड से एक सेकंड से भी कम समय में ला दिया। मैंने सर्वर / क्लाइंट सेटअप का उपयोग करना भी बंद कर दिया है। (वैसे, मैंने स्टार्टअप के समय को कम करने के लिए स्विच नहीं किया था, यह सिर्फ एक अच्छा पक्ष लाभ था।)
उमर

जवाबों:


43

यहाँ मेरे बिंदुओं को कम करने पर emacs-init-time, यह एक डेमॉन या सर्वर का उपयोग करने जैसी चीजों को कवर नहीं करता है, यह बिना यह कहे चला जाता है कि आपको कभी-कभार ईएमआई को बंद करना चाहिए।

मत करो:

  • यदि आपके पास उचित ऑटोलॉड कुकीज़ नहीं हैं, तो सुनिश्चित करें कि आप एंट्री कमांड पर ऑटोलॉड सेट करें। तो अगर आप पहली बार पैकेज का उपयोग foobarफोन करके किया जाएगा foobar-modeऔर foobarथा नहीं आया था पूर्व autoloaded आप कुछ इस तरह की आवश्यकता होगी:

    (autoload 'foobar-mode "foobar")
    

    यह आपको foobar-modeतब भी कॉल करने की अनुमति देगा जब foobarपैकेज अभी तक लोड नहीं हुआ है। इस तरह foobarसे लोड नहीं किया जाएगा जब तक आप वास्तव में कॉल नहीं करते हैंfoobar-mode

  • package-refresh-contentsयदि आपको स्टार्टअप पर पैकेज स्थापित करने की आवश्यकता नहीं है, तो उसे न चलाएं । यदि आप init सेटअप कर रहे हैं, तो ऑटो इंस्टाल गुम पैकेट को स्थापित करने पर विचार करें, जब ऑटो इंस्टाल होना चाहिए, तो निर्दिष्ट करने के लिए कमांड लाइन arg स्थापित करें।

  • ऊपर की तरह, नेटवर्क से संबंधित कुछ भी न करें।
  • desktopजब तक आप वास्तव में वास्तव में नहीं चाहते हैं, तब तक अपने इनिट को लोड न करें।

करना

  • use-packageअपने पैकेज को प्रबंधित करने के लिए कुछ का उपयोग करें। इससे यह निर्दिष्ट करना आसान हो जाता है कि किस चीज की आवश्यकता है, बाद में क्या लोड करना है, कौन सा ऑटोलॉड्स क्या है और पैकेज के आधार पर पैकेज के आधार पर आपके इनाइल को आसान बनाता है।

  • किसी विषय को लोड करने और उसे सक्षम करने के बीच का अंतर जानते हैं। संक्षेप में, आप जितना चाहें उतने लोड कर सकते हैं, लेकिन सुनिश्चित करें कि आप एक से अधिक सक्षम नहीं कर रहे हैं। आदर्श रूप में, केवल एक विषय को लोड और सक्षम करें। load-themeविषय को सक्षम करने से रोकने के लिए एक वैकल्पिक arg की जरूरत है। यह कई विषयों को गलती से सक्षम करने में आसान हो सकता है जो स्टार्टअप के दौरान धीमा और बदसूरत है।

  • धोखा दें: अक्सर बड़े वैश्विक मोड होते हैं जिन्हें आप init पर लोड करना चाहते हैं, पूर्ववत, स्वत: पूर्ण, आईडीओ-मोड आदि जैसी चीजें सुनिश्चित करें कि प्रवेश कार्यों में ऑटोलॉड्स सेटअप है फिर पैकेज लोड करने के लिए अपने इनिट में बेकार टाइमर शुरू करें। । मैं यह करना चाहता हूं undo-tree-mode, idoऔर अन्य लोग कभी भी देरी नहीं करते हैं क्योंकि जब तक मुझे वास्तव में उनका उपयोग करने की आवश्यकता होती है, तब तक वे पहले से ही लोड होते हैं।

    अपडेट: उपयोग-पैकेज थोड़ा बदल गया है, टाइमर सुविधाओं का उपयोग शुरू करने से पहले आधिकारिक रीडमी पढ़ें।

    उदाहरण के लिए: यदि आप थोड़ी देर करना चाहते हैं तो आप इसे लोड करने के लिए global-undo-tree-modeअपने इनिट में डाल सकते हैं:

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

    अब आपका init खुशी के साथ जारी रह सकता है और global-undo-tree-modeवास्तव में तब तक सक्रिय नहीं होगा जब तक कि सब कुछ जाने के लिए तैयार न हो और आप पहिया के पीछे हों।

    use-packageइस तरह के व्यवहार के लिए समर्थन है: निष्क्रिय कीवर्ड का उपयोग करते हुए। यहाँ 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 एक अविश्वसनीय उपकरण है, जिसका उपयोग मैंने अपने इनिट को ~ 6 सेकंड से <1 सेकंड तक नीचे ले जाने में मदद करने के लिए किया है।

एक अच्छी तरह से कॉन्फ़िगर किया गया use-packageइनिट अविश्वसनीय रूप से तेज़ हो सकता है। मैं अपने इनिट को बाइट-संकलित नहीं करता हूं और यह use-package95 पैकेजों को कॉन्फ़िगर करने के लिए उपयोग करता है और <1 सेकंड में शुरू होता है।


7
"अपने इनिट को प्रोफ़ाइल करें, यह देखना हमेशा आश्चर्यचकित होता है कि वास्तविक धीमी गति कहां है।" स्पॉयलर अलर्ट, यह वह (require 'org)लाइन है। :-)
मालाबार

@ जोर्डन, क्या आप इस बात पर थोड़ा विस्तार कर सकते हैं कि आप यह सुनिश्चित करते हैं कि एंट्री फ़ंक्शंस में ऑटो-लोड सेटअप हो और फिर पैकेज लोड करने के लिए अपने इनिट में बेकार टाइमर शुरू करें, विशेष रूप से पूर्व-ट्री-मोड के लिए? धन्यवाद।
फ्रांसिस्को दिबर

@FranciscoDibar मैंने अपने पोस्ट को उदाहरणों के साथ अपडेट किया है।
जोर्डन बियोन्डो

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

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 # 'कमांड है।
एंड्रयू स्वान

8

कुछ ऐसा जो हाल ही में एमएसीएस रेडिट पर पॉप अप हुआ है : अपनी इनिट फ़ाइल की शुरुआत के पास इसे डालकर कचरा संग्रहण के चालान की संख्या में कमी करें:

(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
सिवाय इसके कि मूल्य (ए) शायद आपकी ज़रूरत से ज़्यादा है (मुझे उस के दसवें हिस्से के साथ कोई अंतर नहीं दिखता); और (बी) स्पष्ट रूप से ऐसा मूल्य नहीं है जिसे आप स्टार्ट-अप से आगे जारी रखना चाहते हैं, क्योंकि जब भी जीसी होता है, तो एक बड़ा जीसी थ्रेशोल्ड लंबी देरी के बराबर होता है। यदि आप इसे init के लिए उच्च सेट करते हैं, तो init के बाद इसे फिर से कम सेट करें। मुझे लगता है कि emacs-startup-hookऐसा करने के लिए एक अच्छी जगह है।
22:14

1
@ धन्यवाद! (a) मेरे सेटअप पर, 50Mb GCs की न्यूनतम संख्या (और न्यूनतम स्टार्टअप समय) देता है। अगर मैं 10Mb जितना नीचे जाता हूं, तो अंतर ध्यान देने योग्य / औसत दर्जे का है (हालांकि यह व्यवहार में बहुत अधिक परिवर्तन नहीं करता है ...) (बी) अच्छा विचार, धन्यवाद। मैंने आपकी टिप्पणी को प्रतिबिंबित करने के लिए पोस्ट को संपादित किया।
ffevotte

6

आपके स्टार्टअप के समय का अनुकूलन करने में लगने वाला समय संभवतः उन सभी अतिरिक्त समय से अधिक हो जाएगा जो आपने अन्यथा Emacs के शुरू होने का इंतजार किया होगा।

फिलहाल मैं requireअपने इनिट फ़ाइल में 25 कॉल करता हूं ताकि फ्लाईकैच को मेरे कोड में वर्तनी की त्रुटियां मिलें। मेरा स्टार्टअप टाइम है ...

$ 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 सेकंड है।

यह कहें कि मैं अपनी इनिट फ़ाइल में अनुकूलन के सभी मामलों को बनाने में एक घंटा लगाता हूं। (मैं बाद की तारीख में बिताए अतिरिक्त 15-30 मिनटों की गणना करने की कोशिश नहीं करूंगा कि मेरी इनिट फ़ाइल बाइट-संकलित होने के कारण मेरे परिवर्तन क्यों प्रभावी नहीं हो रहे हैं।) (मैं समय भी नहीं गिनूंगा। फ्लाइचेक ने मुझे डिबगर में बचा लिया होता अगर मैंने requireकॉल नहीं हटाए होते।) एक घंटे में 3600 सेकंड होते हैं, इसलिए यदि मैं पूरे 2.3 सेकंड को बचाने में कामयाब रहा, तो समय में मेरा निवेश 1565 स्टार्टअप के बाद ही भुगतान करेगा।

यह मानते हुए कि मैं Emacs को दिन में 3 बार पुनः आरंभ करता हूं, हर दिन, उस निवेश का भुगतान करने में एक वर्ष और आधा समय लगेगा। यदि मैं एक ही Emacs इंस्टेंस को एक समय पर दिनों के लिए छोड़ देता हूं (जैसा कि मैं अक्सर करता हूं), मैं शायद सप्ताह में केवल 2-5 बार पुनरारंभ करता हूं, उस स्थिति में उस निवेश को भुगतान करने में 6 से 15 साल लगेंगे।

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


12
लेकिन आप संभवतः अधिक खुश रहेंगे।
फोर्स

2
यह एक व्यक्ति के लिए सही हो सकता है, लेकिन StackExchange की पूरी बात साझा करने के बारे में है। एक ऐसी चाल के बारे में जो एक व्यक्ति को खोजने में 30 मिनट का समय लेती है, लेकिन दर्जनों लोगों के स्टार्टअप समय से 1 सेकंड दूर है? क्या आप इसे अभी भी बुरा निवेश मानेंगे?
ffevotte

@ विडंबना यह है कि मैं एक ही बात कह रहा था, लेकिन अपने दृष्टिकोण के समर्थन में! "इससे पहले कि आप अपने स्टार्टअप के समय के बारे में सोचें, अपने आप से सोचें, 'मुझे खुशी है कि मैंने इसे अनुकूलित करने में समय बर्बाद नहीं किया!"
जैक्सन

@Francesco और यह पोस्ट मेरी चाल है जो दर्जनों लोगों का समय बचाती है।
जैक्सन

@Jackson मैं अभी भी इस विशेष मुद्दे पर आपसे सहमत नहीं हूं, लेकिन कम से कम अब मैं आपकी बात देखता हूं। धन्यवाद :)
ffevotte
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.