2009-10-08 8 views
9

मैं विजुअल स्टूडियो का उपयोग कर रहा हूं, और ऐसा लगता है कि अप्रयुक्त संदर्भों से छुटकारा पाने और बयानों का उपयोग करने से बड़ी परियोजनाओं पर मेरे निर्माण का समय बढ़ जाता है। क्या निर्माण समय को तेज करने के अन्य ज्ञात तरीके हैं। अन्य भाषाओं और पर्यावरण के निर्माण के बारे में क्या?निर्माण/संकलन समय में सुधार के तरीके क्या हैं?

निर्माण/संकलन के दौरान आम तौर पर बाधा क्या होती है? डिस्क, सीपीयू, मेमोरी?

क्या/की एक सूची रहे हैं अच्छा संदर्भ वितरित बनाता है के लिए है?

+3

असल में यह भाषा-अज्ञेयवादी नहीं है। विभिन्न भाषाओं में एक कंपाइलर के लिए अलग-अलग आवश्यकताएं होती हैं, जो संकलित समय को महत्वपूर्ण रूप से प्रभावित करती हैं, –

+0

सच है, लेकिन मेरा प्रश्न विभिन्न कंपाइलर्स, वातावरण, भाषाओं आदि में प्रदर्शन को बेहतर बनाने के तरीके से अधिक है .. मैं आमतौर पर विजुअल स्टूडियो का उपयोग करता हूं, लेकिन कभी-कभी msbuild, perl , आदि .. – esac

उत्तर

6

हमारे बड़े सी ++ प्रोजेक्ट के लिए हमने जो सबसे बड़ा सुधार किया है, वह हमारे निर्माण को वितरित करने से था। कुछ साल पहले, एक पूर्ण निर्माण में लगभग आधे घंटे लगेंगे, जबकि अब यह लगभग तीन मिनट है, जिसमें से एक तिहाई लिंक समय है।

हम एक मालिकाना निर्माण प्रणाली का उपयोग कर रहे हैं, लेकिन IncrediBuild बहुत से लोगों के लिए ठीक काम कर रहा है (हम इसे विश्वसनीय रूप से काम करने के लिए नहीं मिल सका)।

+0

+1 वितरित बिल्ड = $$ –

+0

मैं एक प्रश्न पूछना चाहता हूं कि 'संकलन' और 'बिल्ड' – PageYe

3

आपके कंपाइलर चेतावनियों को ठीक करने में काफी मदद मिलनी चाहिए।

+0

केवल अगर वह "सीएल" कमांड लाइन उपकरण का उपयोग करता है। फ़ाइल में stdout लिखना धीमा नहीं है - यहां तक ​​कि विंडोज़ पर भी। – Lothar

+0

मैं सिर्फ उत्सुक हूं अगर यह उन्हें एक लॉगफाइल पर लिखने के कारण है जो मंदी का कारण बनता है, इसलिए यदि आपके पास कुछ चेतावनियां हैं, या कोई बाधा नहीं है, तो इससे कोई फर्क नहीं पड़ता? – esac

+2

इसे वापस करने के लिए कोई लिंक? हमारा कार्यक्रम 5000+ कंपाइलर चेतावनियां उत्पन्न करता है और मैं कुछ समय के लिए उपाय करने के लिए एक अच्छा बहाना ढूंढ रहा हूं –

1

दृश्य स्टूडियो समानांतर बनाता है, मदद कर सकते हैं जो का समर्थन करता है, लेकिन सच है टोंटी डिस्क आईओ है।

उदाहरण के लिए सी में - अगर आप LST उत्पन्न अपने संकलन फ़ाइलें उम्र ले जाएगा।

+0

एलएसटी फ़ाइल क्या है? –

+0

एक लिस्टिंग फ़ाइल। यह दिए गए स्रोत कोड के लिए असेंबली निर्देशों का एक आउटपुट है। कई बार इसमें असेंबली के साथ सोर्स कोड टेक्स्ट इनलाइन भी शामिल है ताकि आप देख सकें कि कौन से निर्देश स्रोत कोड की लाइनों से जुड़े हैं। – sylvanaar

+0

वाई एसएसडी ....... – xaxxon

0

डीबग चालू के साथ संकलित न करें।

+1

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

+1

मैंने यह नहीं कहा कि यह w/डीबग चालू करने के साथ संकलित करने के लिए उपयोगी नहीं है। सवाल पूछा गया कि केवल संकलन समय में सुधार कैसे करें। –

2

कृपया इस पुस्तक को पढ़ें। यह आपके प्रोजेक्ट को कम से कम पुनर्निर्माण के साथ विभिन्न फ़ाइलों में भौतिक संरचना के विषय पर बहुत अच्छा है। पहले टेम्प्लेट कि महत्वपूर्ण बन गया

Unforunately यह लिखा गया था। जब सी ++ संकलन की बात आती है तो टेम्पलेट वास्तविक समय हत्यारा होते हैं। Especialls यदि आप गलती करते हैं और हर जगह स्मार्ट पॉइंटर्स का उपयोग करते हैं। इस मामले में आप केवल नवीनतम सीपीयू और हाल ही में एसएसडी ड्राइव में अपग्रेड कर सकते हैं। अगर आप precompiled हेडर का उपयोग करते हैं तो एमएसवीसी पहले से ही मौजूदा सी ++ कंपाइलर है।

http://ecx.images-amazon.com/images/I/51HNJ7KBBAL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg http://ecx.images-amazon.com/images/I/51HNJ7KBBAL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

+1

स्मार्ट पॉइंटर्स का उपयोग करने से क्या करना है? –

3
+0

यह हमेशा मामला नहीं है। मेरे पास काम पर एक प्रोजेक्ट है जिसे मैंने 2.83GHz अंतिम-जेन से 3.2 गीगाहर्ट्ज प्रोसेसर, क्वाड कोर दोनों में अपग्रेड किया है। मैं 8 जीबी से 16 जीबी तक मेमोरी की मात्रा दोगुना करता हूं। मैंने RAID0 7200RPM से RAID0 15K SAS पर स्विच किया, और मुझे अभी भी बिल्ड समय में सुधार दिखाई नहीं दे रहा है। विचार करने के लिए अन्य कारक लगते हैं। – esac

+0

यह केवल थोड़ी मदद करेगा। वितरण (मेरा जवाब देखें) आपको कई और चक्र देगा। वितरित होने पर हम 3GHz से 900GHz तक चले गए। :) सम्मान, सेबेस्टियान –

+0

मुझे लगता है कि 1 कोर से 8 कोर तक अपग्रेड प्रदर्शन में काफी सुधार करेगा - शायद इस मामले में डिस्क I/O बाधा होगी। –

3

मेरे पिछले काम में हम संकलन समय के साथ बड़ी समस्याओं और रणनीतियों हम इस्तेमाल किया लिफाफा पैटर्न को देखने के here बुलाया गया था में से एक था।

मूल रूप से यह हेडर आकार को कम करके प्री-प्रोसेसर द्वारा शीर्षलेख में कॉपी किए गए कोड की मात्रा को कम करने का प्रयास करता है। ऐसा कुछ ऐसा करने से किया जो निजी मित्र वर्ग के लिए सार्वजनिक नहीं था, यहां एक उदाहरण है।

foo.h:

class FooPrivate; 
class Foo 
{ 
public: 
    Foo(); 
    virtual ~Foo(); 
    void bar(); 
private: 
    friend class FooPrivate; 
    FooPrivate *foo; 
}; 

foo.cpp:

Foo::Foo() 
{ 
    foo = new FooPrivate(); 
} 

class FooPrivate 
{ 
    int privData; 
    char *morePrivData; 
}; 

अधिक फ़ाइलें आप के साथ और अधिक यह कहते हैं ऐसा करने में शामिल हैं। यह वास्तव में आपके संकलन समय में मदद करता है।

यह चीजें VC6 में डिबग करने के लिए, हालांकि के रूप में मैं मुश्किल तरीके से सीखा मुश्किल पड़ता है। एक कारण है कि यह पिछली नौकरी है।

+0

यदि आप अपने रखरखाव चक्र के साथ इस समाधान के साथ खुश नहीं हैं, तो इसका सुझाव क्यों है? एक चेतावनी के रूप में –

+0

। मैं इसका सुझाव दे रहा हूं ताकि लोग जान सकें कि यह अस्तित्व में है, और हर कीमत पर इससे बचें। यह काम करता है, यह संकलन समय को कम करता है, लेकिन जैसा कि मैंने कहा, डीसीगिंग वीसी 6 पर लगभग असंभव है। – ReaperUnreal

2

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

थोक के विचार अपनी परियोजना नीचे उपखंड में एक एकल फाइल में है कि उपधारा में सभी सीपीपी फ़ाइलों तोड़ने के लिए और शामिल करने के लिए बनाता है। एकता एक और सीपीपी फ़ाइल बनाकर इसे आगे ले जाती है जिसे संकलित किया जाता है जो अन्य सभी सीपीपी फाइलों को जोड़ता है।

कारण इस बार तेजी से होता है है:

1) टेम्पलेट्स केवल एक बार प्रति बल्क फ़ाइल मूल्यांकन किया जाता है

2) शामिल फ़ाइलें खोल रहे हैं/प्रति बल्क फ़ाइल केवल एक बार संसाधित (यह मानते हुए है एक उचित #ifndef FILE__FILENAME__H/#define FILE__FILENAME__H/#endif फ़ाइल में शामिल रैपर)। कुल I/O को कम करना संकलन के समय के लिए एक अच्छी बात है।

3) लिंकर बहुत कम डेटा (एकल एकता OBJ फ़ाइल या कई थोक OBJ फ़ाइलों) के साथ काम करने के लिए है और आभासी स्मृति के लिए पृष्ठ पर जाने की संभावना कम है।

संपादित ढेर अतिप्रवाह पर यहाँ links के couple जोड़ा जा रहा है के बारे में एकता बनाता है।

2

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

+0

के बीच अंतर क्या है, मैं सहमत हूं कि यह महत्वपूर्ण है, लेकिन क्या यह वास्तव में "बहुत महंगा" है? –

0

सी ++ के लिए मेयर बाधा डिस्क I/O है। कई शीर्षकों में अन्य शीर्षलेखों को पीछे और आगे शामिल किया जाता है, जिससे कई फाइलें खोली जा सकती हैं और प्रत्येक संकलन इकाई के लिए पढ़ी जाती हैं।

यदि आप स्रोतों को रैम-डिस्क में ले जाते हैं तो आप महत्वपूर्ण सुधार तक पहुंच सकते हैं। और भी अधिक यदि आप सुनिश्चित करते हैं कि आपकी स्रोत फ़ाइलें बिल्कुल एक बार पढ़ती हैं।

तो नई परियोजनाओं के लिए मैं एक एकल फाइल मैं _.cpp फोन में सब कुछ शामिल करने के लिए शुरू कर दिया। इसकी संरचना इस तरह है:

/* Standard headers */ 
#include <vector> 
#include <cstdio> 
//... 

/* My global macros*/ 
#define MY_ARRAY_SIZE(X) (sizeof(X)/sizeof(X[0])) 

// My headers 
#include "foo.h" 
#include "bar.h" 
//... 

// My modules 
#include "foo.cpp" 
#include "bar.cpp" 

और मैं केवल इस एकल फ़ाइल को संकलित करता हूं।

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

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

इस तरह प्रत्येक स्रोत फ़ाइल और शीर्षलेख बिल्कुल एक बार पढ़ा जाता है, और बहुत तेज़ी से बनाता है। संकलन समय केवल रैखिक रूप से बढ़ते हैं क्योंकि आप अधिक फाइलें जोड़ते हैं, लेकिन चौकोर रूप से नहीं। मेरा शौक परियोजना लगभग 40000 लोक और 500 मॉड्यूल है लेकिन अभी भी लगभग 10-20 सेकंड संकलित है। यदि मैं सभी स्रोतों और शीर्षकों को रैम-डिस्क संकलन समय में ले जाता हूं तो 3 सेकंड तक कम हो जाता है।

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

0

सी # के लिए - ऑटो वृद्धिशील लोगों की बजाय आपके असेंबली के लिए निश्चित संस्करणों का उपयोग करने से बाद में स्थानीय निर्माण में तेजी आती है।

असेंबलीइन्फो।सीएस

// takes longer to update version number changes on all references to this assembly 
[assembly: AssemblyVersion("1.0.*")] 

// this way already built assemblies do not need to be recompiled 
// to update version number changes. 
[assembly: AssemblyVersion("1.0.0.0")] 
0

संकलन समय और भंगुर आधार वर्ग समस्या: मैं सी में संकलन समय में सुधार करने के लिए एक रास्ता ++ पर एक ब्लॉग लिखा है। Link

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