फ़ॉन्ट लॉक प्रदर्शन का अनुकूलन


13

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

मैंने एक फंक्शन बनाया है जो ऐसा करता है और इसे जित-लॉक-रजिस्टर के साथ जिट-लॉक फंक्शन के रूप में पंजीकृत किया है, हालांकि, प्रदर्शन बहुत खराब है और बड़ी फ़ाइलों में स्क्रॉल करता है।

  • मैं प्रदर्शन को कैसे माप सकता हूं? अगर मुझे सिर्फ एक बड़े फ़ाइल पर अपने फ़ंक्शन को कॉल करने में (फ़्लोट-समय से पहले और बाद में या एलपी के साथ) मुझे बेतहाशा अलग-अलग प्रदर्शन मिलता है, तो यह 0.65 से 12 सेकंड तक कुछ भी लेता है। क्या बेंचमार्क फ़ॉन्ट लॉक प्रदर्शन के लिए अनुशंसित तरीका है?
  • क्या फॉन्ट-लॉक-कीवर्ड्स में परिभाषित एंकर मैचर और जित-लॉक-रजिस्टर के माध्यम से फ़ंक्शन जोड़ने के बीच प्रदर्शन में कोई अंतर है?

संपादित करें: ऐसा लगता है कि प्रदर्शन में परिवर्तनशीलता कचरा संग्रह से संबंधित है, मेरे जीट-लॉक फ़ंक्शन के इनवोकेशन प्रत्येक इनवोकेशन के साथ क्रमिक रूप से धीमा हो जाते हैं जब तक कि कचरा संग्रह नहीं चलता है, जिस बिंदु पर वे फिर से तेज हो जाते हैं।


पहले आइटम के लिए, प्रोफाइलर का प्रयास करें।
मालाबार

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

क्या आपके पास कुछ कोड हैं जो हम परीक्षण कर सकते हैं? यह हमारी बहुत मदद कर सकता है।
पायथनटन

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

फ़ॉन्ट-लॉक-स्टूडियो के बारे में टिप के लिए धन्यवाद, यह बहुत बढ़िया है! हालांकि, जिट-लॉक-फ़ंक्शंस के साथ मदद नहीं करता है, लेकिन निश्चित रूप से सब कुछ के साथ करता है।
जोकिम हार्शमैन

जवाबों:


8

यह पता चला है कि बेतहाशा भिन्न प्रदर्शन कचरा संग्रहण से संबंधित था। समारोह में प्रत्येक कॉल तब तक धीमी हो जाएगी जब तक कि कचरा संग्रह नहीं हो जाता। स्टॉक एमएसीएस के साथ, हर दो सेकंड में 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))))

क्या आप अपने द्वारा उपयोग किए गए कोड को साझा कर सकते हैं? आपका समाधान दूसरों को उसी चीज़ को प्राप्त करने में मदद कर सकता है।
मैनुअल उबरती

मैं वास्तव में किसी भी विशिष्ट कोड का उपयोग नहीं किया, मैं सिर्फ वाक्यविन्यास-पीपीएस कम कहा जाता है। आप यहाँ प्रश्न में कोड देख सकते हैं: bitbucket.org/harsman/dyalog-mode/src/… के लिए देखो dyalog-fontify-locals
जोकिम हार्शमैन

मुझे लगता है कि dyalog-fontify-locals-matcherहोना चाहिए my-font-lock-matcherऔर एक endहोना चाहिए limit। वैसे भी, वास्तव में दिलचस्प खोज!
लिंडनाइडर्स

@ लिंडकैंसर: जी धन्यवाद। फिक्स्ड।
जोकिम हार्शमैन

1
पुन:, gc-cons-thresholdयदि आप स्टार्ट-अप समय को बेहतर बनाने के लिए आंतरिक मूल्यों के साथ खिलवाड़ कर रहे हैं, तो मेरा सुझाव है कि आप emacs-startup-hookउन्हें बाद में बहाल करने के लिए उपयोग करें।
फिल्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.