यह पता चला है कि बेतहाशा भिन्न प्रदर्शन कचरा संग्रहण से संबंधित था। समारोह में प्रत्येक कॉल तब तक धीमी हो जाएगी जब तक कि कचरा संग्रह नहीं हो जाता। स्टॉक एमएसीएस के साथ, हर दो सेकंड में gc चलाया जाता था, लेकिन मेरे पास init.el में एक लाइन थी स्टार्टअप समय को बेहतर बनाने के लिए जिसने gc-cons-थ्रेशोल्ड को 20 MB पर सेट किया था, और इसका मतलब था कि gc को अधिक बार चलाया गया था, जिससे बेंचमार्क धीमे और धीमे समय की रिपोर्ट करें जब तक कि कुछ मिनटों के बाद एक जीसी चलाया नहीं जाता, तब तक समय फिर से घट जाएगा और फिर से तेज होगा।
डिफ़ॉल्ट जीसी-कंस-थ्रेशहोल्ड में लौटने के बाद, बेंचमार्किंग आसान हो गई।
मैंने इसके बाद प्रोफाइलर में निर्मित ( M-x profiler-start
) के साथ मेमोरी के लिए प्रोफाइल किया , और पता चला कि सिंटैक्स-पीपीएस को कॉल करने से सबसे अधिक आवंटन हुआ, इसलिए सिंटैक्स-पीपीएस को कॉल करने के लिए कुछ अनुकूलन के बाद कम बार मैंने स्वीकार्य प्रदर्शन हासिल किया।
जीट-लॉक-मोड का उपयोग करना (जीट-लॉक-रजिस्टर के माध्यम से एक फ़ंक्शन जोड़ना) मल्टी लाइन फ़ॉन्ट लॉकिंग को मज़बूती से काम करने के लिए सबसे आसान तरीका लगता है, इसलिए यह वही तरीका था जिसे मैंने चुना था।
संपादित करें: यह पता लगाने के बाद कि प्रदर्शन अभी भी बहुत बड़े बफ़र्स में पर्याप्त अच्छा नहीं था, मैंने सीपीयू के उपयोग और आवंटन को अनुकूलित करने में बहुत समय बिताया, ईमैक प्रोफाइलर ( M-x profiler-start
) में निर्मित प्रदर्शन सुधारों को मापा । हालांकि, Emacs अभी भी हकलाना और लटकाएंगे जब बहुत बड़े बफ़र्स के माध्यम से जल्दी से स्क्रॉल करना। मेरे द्वारा पंजीकृत जीट-लॉक फ़ंक्शन jit-lock-register
को हटाने से हकलाना और लटकना दूर हो जाएगा, लेकिन प्रोफाइलिंग ने जित-लॉक फ़ंक्शन को लगभग 8 एमएस में पूरा करने के लिए दिखाया जो कि चिकनी स्क्रॉलिंग के लिए पर्याप्त तेज़ होना चाहिए। jit-lock-register
नियमित फ़ॉन्ट-लॉक-कीवर्ड मिलानकर्ता का उपयोग करने के बजाय कॉल को निकालना और समस्या हल करना।
TLDR: ऐसा करना धीमा था और हकलाना होगा:
(defun my-font-lock-function (start end)
"Set faces for font-lock between START and END.")
(jit-lock-register 'my-font-lock-function)
ऐसा करना तेज था और हकलाना नहीं चाहिए:
(defun my-font-lock-function (start end)
"Set faces for font-lock between START and END.")
(defun my-font-lock-matcher (limit)
(my-font-lock-function (point) limit)
nil)
(setq font-lock-defaults
(list
...
;; Note that the face specified here doesn't matter since
;; my-font-lock-matcher always returns nil and sets the face on
;; its own.
`(my-font-lock-matcher (1 font-lock-keyword-face nil))))