क्या कोई 'जीसी-कंस-थ्रेशोल्ड' स्थापित करने के लिए बहुत अधिक है और बेकार होने पर कचरा इकट्ठा करता है?


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आप की तुलना में किसी भी उच्च रहे हैं तैयार वास्तव में किसी भी समय पर हिट करने के लिए है, क्योंकि आप चाहिए ग्रहण करने के लिए है कि आप होगा वास्तव में है कि मूल्य समय-समय पर (हिट सब के बाद, जो जानता है कि कितना कचरा उपार्जित किया जा सकता है कुछ अप्रत्याशित रूप से उत्साही गैर-निष्क्रिय कार्य)। मुझे निष्क्रिय टाइमर के साथ जीसी ट्रिगर करने में कोई विशेष समस्या नहीं दिखती है, लेकिन मुझे लगता है कि गैर-निष्क्रिय जीसी के लिए दहलीज को सेट करना उतना ही उच्च है जितना कि ओटीटी लगता है, और मेरी धारणा यह है कि मूल्य संभवतः "से अधिक" होने के रूप में चुना गया था। "मुझे कभी भी ज़रूरत होगी" के बजाय "उच्चतम मैं उपयोग करने के लिए तैयार हूं"।
फिल्स

5
स्टीफन मोननियर की इस पोस्ट के अनुसार : "बेहतर है कि इसे स्पर्श न करें। Emacs-22 में हमने gc-cons-प्रतिशत पेश किया है जो कि gc-cons-दहलीज को बढ़ाने के समान लाभ प्रदान करता है लेकिन कमियों के बिना। और इसके साथ बेला होने के बिना। यानी मैं उपयोगकर्ताओं को अपने .emacs से किसी भी gc-cons-दहलीज सेटिंग्स को हटाने की सलाह दूंगा। "
izkon

1
@izkon सिवाय इसके कि आप जिस पोस्ट से 2007 से जुड़े थे, उस समय तक, जैसे कि यह पोस्ट , जहाँ किसी ने वास्तव में प्रयोग किया है - और थ्रेशोल्ड को बदलने से फर्क पड़ा - 2016 की तारीखें वापस आ गईं। अच्छा काम किए।
हाय-एंजेल

1
@ मुझे लगता है कि आप के (eval-when-compile (* 1024 1024 1024))साथ प्रतिस्थापित कर सकते हैं most-positive-fixnum (कृपया ऐसा करें, मुझे पूरा यकीन है कि हर कोई जो आपके प्रश्न पर आता है, आपके कोड को उनके कॉन्फ़िगरेशन में कॉपी करता है)
हाय-एंजेल

2
@ हाय-एंजेल मुझे नहीं लगता कि यह एक अच्छा विचार है। यदि Emacs वास्तव में बेकार हो जाने के बिना भारी मात्रा में मेमोरी आवंटित करते हैं, तो इसे तब तक जारी रखना चाहिए जब तक कि सिस्टम को स्वैप नहीं करना पड़ता है या पूरी तरह से मेमोरी से बाहर चलाता है। अगर कुछ भी, 1GB पहले से ही बहुत अधिक है।
एरिक

जवाबों:


4

जहाँ तक मुझे पता है, अगर आपके पास RAM है, तो यह ठीक है, लेकिन अगर Emacs ने GC'ing से पहले वास्तव में उच्च उपयोग किया है, तो इसमें लंबा समय लग सकता है। मुझे यकीन नहीं है कि एली का मतलब क्या है; ISTM कि यदि आपके पास पर्याप्त मेमोरी है, तो यह ठीक होना चाहिए, लेकिन वह यहां विशेषज्ञ है।

यह कहने के बाद कि, मैंने अपनी इनइट फ़ाइल में इन पंक्तियों का उपयोग कुछ समय के लिए किया है, और यह परिवर्तनों को स्थायी किए बिना स्टार्टअप समय को कम करने में मदद करता है:

;;;;; 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?
एरिक

3
क्योंकि यह आरंभीकरण के तुरंत बाद चलेगा, जो उपयोगकर्ता को GC के लिए प्रतीक्षा कर सकता है। एक निष्क्रिय टाइमर का उपयोग करके, यह तब चल सकता है जब उपयोगकर्ता Emacs का उपयोग नहीं कर रहा है।
२। ’को .:५
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.