यूनिट परीक्षण के लिए एक न्यूनतम Emacs 25 बनाएँ


10

मैं अपने Emacs लिस्प पैकेज के यूनिट-परीक्षण के लिए Emacs ट्रंक का एक बहुत ही न्यूनतम संस्करण बनाना चाहूंगा। बिल्ड को कोई GUI, कोई इमेज सपोर्ट आदि की जरूरत नहीं है, यह मूल रूप से कोर Emacs लिस्प पुस्तकालयों के साथ अनिवार्य रूप से एक न्यूनतम Emacs Lisp दुभाषिया होना चाहिए, और यह तेजी से निर्माण करना चाहिए , आदर्श रूप से कम से कम पांच मिनट में।

वर्तमान में, मैं पास --with-x-toolkit=no --without-x --without-allकर रहा हूँ ./configure। समाप्त होने के बाद, यह मुझे बताता है कि सभी Emacs सुविधाएँ अक्षम हैं, लेकिन दुर्भाग्य से निर्माण में अभी भी लगभग दस मिनट लगते हैं

मैं समझता हूं कि Emacs को तेजी से बनाना असंभव हो सकता है, लेकिन मुझे जो आश्चर्य होता है वह यह है कि बहुत ही झंडे Emacs 24.5 केवल दो मिनट में बनाता है ।

इस सकल अंतर का कारण क्या है, और क्या मैं Emacs ट्रंक को Emacs 24.5 के रूप में तेजी से निर्माण कर सकता हूं?

और, एक संबंधित प्रश्न में, मुझे चुपचाप निर्माण करने के लिए Emacs कैसे मिलेगा? वर्तमान में मेरी यूनिट टेस्ट आउटपुट का लगभग 80% एमएसीएस बिल्डिंग है। आदर्श रूप में, मैं make installकोई आउटपुट नहीं छापना चाहूंगा ।


क्या आप किसी प्रकार के CI प्लेटफॉर्म पर ऐसा करने की योजना बना रहे हैं? यदि नहीं तो आप किस तरह का कंप्यूटर इस्तेमाल कर रहे हैं? जाहिर है कि बिल्ड स्पीड आपके प्रोसेसर पर बहुत निर्भर करने वाली है, लेकिन मेरे लिए ./configure --with... && make -j (number of cores * 1.5)30 सेकंड में खत्म होती है। यदि आप किसी स्थानीय मशीन पर चल रहे हैं, तो बनाने के लिए -j तर्क का उपयोग करना सुनिश्चित करें। क्या आपके पास करने के लिए एक अच्छा कारण है make install? यदि आप src डायरेक्टरी से सिर्फ emacs चलाते हैं तो यह थोड़ा समय जोड़ देगा।
जॉर्डन बायोनडो

यह ट्रैविस सीआई है, लेकिन मुझे नहीं लगता कि यह क्यों मायने रखता है? यह उसी मशीन में दो अलग-अलग Emacs संस्करणों के बीच का स्थूल अंतर है जिसे मैं स्पष्ट करना चाहता हूं। IOW उसी प्रणाली पर निर्माण करने के लिए पांच गुना अधिक समय क्यों रौंदता है ?
११:१५ बजे चंद्र

एक रिपॉजिटरी से बिल्डिंग को कुछ फाइलें बनाने की जरूरत होती है, जो पहले से ही वितरित टारबॉल में मौजूद हैं।
पॉलिट्जा

@politza क्या फाइलें हैं? मुझे पता है कि मुझे ./autogen.shउत्पन्न करने के लिए दौड़ने की आवश्यकता है configure, लेकिन यह कुछ ही मिनटों का मामला है, मिनटों का नहीं।
चंद्रग्रहण

2
@lunaryom आपके यहाँ तीन अलग-अलग प्रश्न हैं। 1: कैसे तेजी से emacs का निर्माण करने के लिए, 2: क्यों emacs 24.5 और emacs की तुलना में 25 का निर्माण धीमा करता है: कैसे make installचुपचाप चलाने के लिए। तो कृपया इन्हें 3 प्रश्नों में विभाजित करें, ताकि उन्हें अलग से ट्रैक किया जा सके और एक प्रश्न के साथ छड़ी करने के लिए इसे तदनुसार संपादित किया जा सके।
रॉकी

जवाबों:


8

24.5 का कारण आपके लिए इतनी जल्दी बनता है कि .elcफ़ाइलें वास्तव में टारबॉल में वितरित की जाती हैं, मेक-डिस्ट को देखें । गिट से निर्माण करते समय, अधिकांश समय .elफाइलों को संकलित करने में खर्च होता है .elc। सी कोड को अनुकूलित करके, लिस्प संकलन तेजी से जा सकता है, लेकिन इसमें अभी भी लंबा समय लगता है। अपनी मूल सेटिंग्स (~ 14 बनाम ~ 1 मिनट) का उपयोग करके एक बिल्ड केCFLAGS='-O2 -march=native' साथ निर्माण समय की तुलना करें (~ 9 बनाम ~ 1.5 मिनट)।

इसके अलावा, git से क्लोनिंग में लगभग एक मिनट का समय लगता है, जबकि टैरबॉल को डाउनलोड और अनपैक करने में लगभग 5 सेकंड लगते हैं। जब आप g24ub (~ 5, ~ 6, ~ 8 मिनट के लिए v24.5, मास्टर, और emacs-25, क्रमशः से संग्रह डाउनलोड करते हैं, तो संस्करणों के बीच बिल्ड समय की तुलना करें । जैसा कि आप देख सकते हैं, जब वितरण टारबॉल का उपयोग नहीं किया जाता है, तो सभी। बिल्ड समय कम से कम परिमाण का एक ही क्रम है। (यह नहीं पता कि क्यों एमएसीएस -25 मास्टर की तुलना में धीमा था, यादृच्छिक भिन्नता हो सकती है, या मास्टर में कुछ अप्रचलित कोड हटा दिया गया था?)।

और, एक संबंधित प्रश्न में, मुझे चुपचाप निर्माण करने के लिए Emacs कैसे मिलेगा? वर्तमान में मेरी यूनिट टेस्ट आउटपुट का लगभग 80% एमएसीएस बिल्डिंग है। आदर्श रूप में, मैं make installकोई आउटपुट नहीं छापना चाहूंगा ।

आप हमेशा आउटपुट को रीडायरेक्ट कर सकते हैं /dev/null। अपने प्रयोगों के लिए मैंने make installआउटपुट पर grep -E '^(make|[A-Z])'कटौती करने के लिए आउटपुट को पाइप किया (ट्रैविस CI जावास्क्रिप्ट जो वेब पर लॉग को पूर्ण आउटपुट से परेशान कर रहा था) को प्रारूपित करता है।

क्या मैं Emacs ट्रंक को Emacs 24.5 के रूप में तेजी से निर्माण कर सकता हूं?

नहीं (या हाँ इस अर्थ में कि आपको Emacs 24.5 मिल सकता है निर्माण करने के लिए (लगभग) Emacs ट्रंक के रूप में धीमा: p)। लेकिन आप जो कर सकते हैं वह Emacs बिल्ड को सहेजना है, और यूनिट-परीक्षण के लिए केवल उस कैश्ड परिणाम को डाउनलोड करना है। मैंने इसे अपने emacs-travis fork की अपलोड शाखा में लागू किया है , यहाँ yasnippet द्वारा एक उदाहरण का उपयोग किया गया है : Emacs install time ~ 2.5 सेकंड है।


3

यहाँ विभिन्न सुझाव दिए गए हैं।

  1. कोई एल्क फाइलें नहीं।

जैसा कि नीचे कहा गया है, सभी लिस्प फ़ाइलों का संकलन कम से कम 10% समय के लिए होता है। अक्षम करने का एक तरीका यह है कि फाइल में लोडडेफ़्स लक्ष्य को संपादित करें और इसे इसमेंlisp/Makefile बदलें:

    $(lisp)/loaddefs.el: $(LOADDEFS)
          true
  1. कोई कंपाइलर ऑप्टिमाइज़ेशन या डीबगर प्रतीक टेबल नहीं

वर्तमान में, मैं --with-x-toolkit = no --without-x --without-all -/configure से गुजर रहा हूं।

मैं सी संकलन समय को 1/4 समय (थोड़ा कम मिनट से 16 सेकंड तक) तक कम कर सकता था क्योंकि src में बस डिफ़ॉल्ट संकलन झंडे बदल रहे थे। डिफ़ॉल्ट CFLAGS मुझे मिल गया था -g -O3:।

इसलिए इसके बजाय उपयोग करें CFLAGS=''

  1. भागो मत make install, लेकिन अभी src निर्देशिका के अंदर से निर्मित emacs चलाएं ।

जैसा कि कहा गया है कि एक और 10% समय डॉक्स के निर्माण में है। हालाँकि, मैंने इसमें समय नहीं दिया, लेकिन फाइलों को कॉपी करने और एलिस फाइलों को कंप्रेस करने में कोई संदेह नहीं है make install। तो नहीं है। यदि आप समय चार्ट को फिर से करना चाहते हैं, तो दौड़ें remake --profile

उपरोक्त अवलोकन नीचे दिए गए हैं ...।


पहला कदम यह समझना है कि समय कहाँ बिताया जाता है ताकि यह पता लगाया जा सके कि इसे कैसे कम किया जाए। सौभाग्य से Emacs जैसी किसी चीज़ के लिए, मैंने हाल ही में आपको पता लगाने में मदद करने के लिए एक उपकरण (या बल्कि विस्तारित) लिखा है। मैंने रीमेक (GNU मेक का एक कांटा) में एक --profileविकल्प जोड़ा, जो आपको बताएगा कि विशिष्ट लक्ष्यों में कितना समय व्यतीत होता है।

मैंने कोशिश की कि हाल ही में स्नैपशॉट का निर्माण किया जाए और हाँ इसमें लगभग 10 मिनट का समय लगता है। यदि आपके पास रीमेक स्थापित नहीं है, तो मेरे पास आपके द्वारा चलाए जा सकने वाले प्रोफाइल की जानकारी है । मैं जानकारी प्रदर्शित करने के लिए kcachegrind का उपयोग करता हूं, लेकिन विज़ुअलाइज़ेशन टूल के लिए अन्य उपकरण हो सकते हैं। जिस्ट में एक png होता है जो रन का स्क्रीनशॉट होता है।

अब विवरण के लिए ...

मेरे रन में, लगभग 20% समय लिस्प और सूचना फ़ाइलों के निर्माण में खर्च होता है, जो आपको वास्तव में करने की आवश्यकता नहीं है। वास्तव में जानकारी फ़ाइलों की तुलना में लिस्प फ़ाइलों में थोड़ा अधिक खर्च किया जाता है। आप शायद इसे छोड़ने के लिए Makefile को बदल सकते हैं।

एमएसीएस 24 के साथ तुलना करना दिलचस्प हो सकता है। मेरा अनुमान है कि इन दोनों का आकार आनुपातिक रूप से बढ़ा है।

यदि ब्याज (जो आप upvotes द्वारा दिखा सकते हैं) है, तो मैं Makefile को विशिष्ट हैक का सुझाव दूंगा। हालांकि यह अपने आप में किसी को काम करने के लिए प्रेरित करने के लिए पर्याप्त होना चाहिए।


"20% का समय लिस्प के निर्माण में खर्च होता है" - मैंने @ lunaryorn के emacs- travis repo को क्लोन किया है ऐसा लगता है कि make lispयह Emacs 25 के लिए लगभग 60% ले रहा है: travis-ci.org/nposts/emacs-travis/builds/91107858 । और का एक बड़ा हिस्सा make srcभी लिस्प को संकलित कर रहा है, इसलिए मुझे आश्चर्य है कि इन मापों को कैसे मिलाया जाए। 24 Emacs में ऐसा लगता है कि यह केवल cc-*.elफाइलों को संकलित करता है make lisp, क्या यह एक बग है?
npostavs

इसके अलावा, यह ऑप्टिकल भ्रम पर हो सकता है, लेकिन यह मुझे दिखता है कि आपकी प्रोफाइलिंग तस्वीर कुल मिलाकर लगभग 50% है।
npostavs

@npostavs केवल लक्ष्य के समय की रीमेक बनाते हैं, इसमें खुद को शामिल नहीं किया जाता है। यह संभव है और संभावना है कि लिस्प के तहत सभी फ़ाइलों और निर्देशिकाओं के साथ, रीमेक बनाने के लिए गणना करने में "रीमेक" / "मेक" में काफी समय व्यतीत होता है। इसके अलावा, भले ही 'रीमेक' मेक का एक कांटा है, इसलिए वे जो करते हैं, वह समान है, निकट तुलना के लिए आपको रीमेक के प्रोफाइलिंग आउटपुट की तुलना "रीमेक" से करनी चाहिए, प्रोफाइलिंग के बिना, "मेक" नहीं। और उसी रीमेक के साथ भी। संस्करण बनाओ। अंत में, हालांकि कोई व्यक्ति% s इत्यादि से वंचित रह सकता है, समग्र सुझाव आपके डेटा का उपयोग करके लागू होते हैं।
चट्टानी

इसके अलावा, मेरा माप उपयोग कर रहा था CFLAGS=''जो सी संकलन को तेज और लिस्प संकलन संकलन धीमा बनाता है। जैसा कि यह पता चला है, CFLAGS='-O2 -march=native'Emacs 25 के लिए कुल मिलाकर उपयोग तेज है, हालांकि Emacs 24.5 के लिए धीमी गति से: travis-ci.org/npostavs/emacs-travis/builds/91142923
npostss

@npostavs आप निरीक्षण करते हैं: CFLAGS की स्थापना "सी संकलन को तेज और लिस्प संकलन संकलन बनाता है।" लेकिन अगर आप एक एकल परीक्षण चलाने जा रहे हैं, तो मुझे यकीन नहीं है कि समग्र समय: कुछ-प्रकार का-अनुकूलित C संकलन / बिल्ड + LISP संकलन + LISP परीक्षण रन, unoptimized C संकलन या निर्माण + No LISP से कम होगा संकलन + LISP टेस्ट रन।
चट्टानी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.