2008-11-13 5 views
14

मैंने सुना है कि लिंक-टाइम कोड जनरेशन (/ एलटीसीजी स्विच) को सक्षम करना बड़ी परियोजनाओं के लिए एक प्रमुख अनुकूलन हो सकता है जिसमें कई पुस्तकालयों को एक साथ जोड़ने के लिए किया जा सकता है। मेरी टीम इसका उपयोग हमारे समाधान की रिलीज कॉन्फ़िगरेशन में कर रही है, लेकिन लंबे संकलन-समय एक असली ड्रैग है। एक फ़ाइल में एक बदलाव जो कोई अन्य फ़ाइल "जनरेटिंग कोड ..." के 45 सेकंड को ट्रिगर करने पर निर्भर करता है। रिलीज निश्चित रूप से डीबग से बहुत तेज है, लेकिन हम एलटीसीजी को अक्षम करके और बस/ओ 2 छोड़कर एक ही गति-अप प्राप्त कर सकते हैं।लिंक-टाइम कोड जनरेशन के पेशेवर + विपक्ष क्या हैं? (वीएस 2005)

क्या इसे छोड़ने/एलटीसीजी सक्षम करने के लायक है?

उत्तर

12

यह कहना मुश्किल है, क्योंकि यह ज्यादातर आपके प्रोजेक्ट पर निर्भर करता है - और निश्चित रूप से वीएस2005 द्वारा प्रदान किए गए एलटीसीजी की गुणवत्ता (जिसमें मेरे पास न्याय करने के लिए पर्याप्त अनुभव नहीं है)। अंत में, आपको मापना होगा।

हालांकि, मुझे आश्चर्य है कि रिलीज निर्माण की अतिरिक्त अवधि के साथ आपको इतनी सारी समस्याएं क्यों हैं। आपको केवल पुनरुत्पादित, स्थिर, संस्करण वाली बाइनरीयां सौंपनी चाहिए जिनके पुनरुत्पादन या संग्रहीत स्रोत हैं। मैंने कभी-कभी लगातार, वृद्धिशील रिलीज बिल्ड के लिए एक कारण देखा है।

एक टीम के लिए अनुशंसित सेटअप यह है: डेवलपर आमतौर पर अपनी मशीनों पर केवल वृद्धिशील डीबग बिल्ड बनाते हैं। एक रिलीज का निर्माण स्रोत नियंत्रण से पुनर्वितरण योग्य (बाइनरी या यहां तक ​​कि सेटअप) के लिए एक नया संस्करण संख्या और लेबलिंग/स्रोतों को संग्रहीत करने के साथ एक पूर्ण निर्माण होना चाहिए। केवल इन्हें इन-हाउस टेस्टर्स/क्लाइंट को दिया जाना चाहिए।

आदर्श रूप से, आप एक पूर्ण मशीन पर पूर्ण निर्माण, या शायद एक अच्छे पीसी पर वर्चुअल मशीन ले जायेंगे। यह आपको आपके निर्माण के लिए एक स्थिर वातावरण देता है (इसमें शामिल है, तृतीय पक्ष पुस्तकालय, पर्यावरण चर, इत्यादि)।

आदर्श रूप से, इन बिल्डों को स्वचालित ("स्रोत नियंत्रण से सेट करने के लिए एक क्लिक") होना चाहिए, और दैनिक चलाना चाहिए।

+0

'रिलीज बनाना एक नया संस्करण संख्या और स्रोतों को लेबल/संग्रहित करने के साथ, स्रोत नियंत्रण से पुनर्वितरण योग्य (बाइनरी या यहां तक ​​कि सेटअप) का एक पूर्ण निर्माण होना चाहिए, क्या यह खंड में लिखे गए शब्दों के विरोधाभास में नहीं है। मैट Pietrek (जोर मेरा है) द्वारा एलटीसीजी उपयोग पर सीमा [इस लेख] पर [https://msdn.microsoft.com/en-us/library/bb985904.aspx): .. जारी रखने के लिए। – Belloc

+0

'एलटीसीजी आम तौर पर एक अच्छी बात है, कुछ संभावित नुकसान हैं जो आपको प्रभावित कर सकते हैं। सबसे पहले, प्रीकंपिल्ड हेडर और एलटीसीजी असंगत हैं। अधिकांश उपयोगकर्ताओं के लिए यह कोई मुद्दा नहीं होना चाहिए, क्योंकि ** आप आम तौर पर केवल रिलीज बिल्ड में एलटीसीजी चालू करते हैं * *, जहां संकलन समय आमतौर पर कोई समस्या नहीं है। ' – Belloc

+0

मुझे कोई समस्या नहीं दिखाई दे रही है, मेरा मुख्य बिंदु यह है कि रिलीज बिल्ड अवधि को इससे कोई फर्क नहीं पड़ता। रिलीज बिल्ड स्वचालित होना चाहिए और डेवलपर मशीन को अवरुद्ध नहीं करना चाहिए एस (या कम से कम: कम हैं)। ऑप्टिमाइज़र के कारण और एलटीसीजी के कारण वे काफी धीमे हैं। रिहाई के निर्माण में पीसीएच का उपयोग नहीं करने से यह धीमा हो जाएगा, लेकिन इतना नहीं, अपेक्षाकृत बोलना, और विकास के निर्माण को प्रभावित नहीं करता है। --- इसके अलावा सीमा अतीत की बात प्रतीत होती है (वीएस2003 शायद?), AFAICT एलटीसीजी और पीसीएच संगत हैं, – peterchen

-1

मुझे रिलीज बिल्ड के साथ लिंक-टाइम कोड पीढ़ी का उपयोग करके अतिरिक्त संकलन समय के साथ समस्याएं भी नहीं दिखाई देती हैं। मैं केवल प्रति दिन एक बार (रिलीज) में अपना रिलीज संस्करण बनाता हूं, और दिन के दौरान यूनिट-टेस्ट और डिबग बिल्ड का उपयोग करता हूं।

3

मुझे पता है कि बंगी में लोगों ने इसे हेलो 3 के लिए इस्तेमाल किया था, केवल उनका उल्लेख किया गया था कि यह कभी-कभी उनके निर्धारक रीप्ले डेटा को गड़बड़ कर देता था।

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

सुनिश्चित नहीं है कि आप किस प्रकार का ऐप बना रहे हैं, लेकिन कोड में संसाधित किए गए तरीके से बेहतर डेटा संरचनाओं को तोड़ना (बेहतर कैश कोहेरेंसी के लिए) हमारे लिए एक बड़ी जीत थी।

10

यह लिंकर को कोड के वास्तविक संकलन करने की अनुमति देता है, और इसलिए यह इनलाइनिंग जैसे अधिक अनुकूलन कर सकता है।

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

इसलिए यह केवल उन कार्यों के साथ ऐसा कर सकता है जिनके शरीर का शरीर है। इसका अर्थ यह है कि यदि सीपीपी फ़ाइल में कोई फ़ंक्शन किसी अन्य फ़ंक्शन को कॉल करता है जो एक ही सीपीपी फ़ाइल में लागू नहीं होता है (या हेडर फ़ाइल में शामिल है) तो उसके पास फ़ंक्शन का वास्तविक निकाय नहीं है और इसलिए इसे इनलाइन नहीं किया जा सकता है ।

लेकिन यदि आप एलटीसीजी का उपयोग करते हैं, तो यह लिंकर है जो इनलाइनिंग करता है, और इसमें पूरे प्रोजेक्ट की सभी सीपीपी फाइलों में सभी कार्य हैं, कम से कम संदर्भित लिब फाइलें जो एलटीसीजी के साथ नहीं बनाई गई थीं। यह लिंकर (जो संकलक बन जाता है) के साथ काम करने के लिए बहुत कुछ देता है।

लेकिन यह आपके निर्माण को अधिक समय तक लेता है, खासकर जब वृद्धिशील परिवर्तन करते हैं। आप अपने रिलीज बिल्ड कॉन्फ़िगरेशन में एलटीसीजी चालू करना चाहेंगे।

ध्यान दें कि एलटीसीजी प्रोफ़ाइल-निर्देशित अनुकूलन के समान नहीं है।

1

मुझे पता चला है कि डाउनसाइड्स अब संकलित समय हैं और उस मोड में बनाई गई .obj फ़ाइलें (एलटीसीजी चालू) वास्तव में बड़े पैमाने पर हो सकती हैं। उदाहरण के लिए, .obj फ़ाइलें जो 200-500k हो सकती हैं लगभग 2-3 एमबी थीं। यह मेरे साथ हुआ कि मेरी श्रृंखला में परियोजनाओं के एक समूह को संकलित करने के लिए 2 जीबी फ़ोल्डर का कारण बन गया, जिसमें से अधिकांश .obj फाइलें थीं।

संबंधित मुद्दे