2011-12-26 19 views
10

डी सबसे तेज़ प्रोग्रामिंग भाषाओं में से एक है, जो सबसे तेज़ नहीं है, लेकिन यह हमेशा मामला नहीं है। unittest चालू होने पर चीजें दर्द से धीमी हो जाती हैं। मेरी वर्तमान परियोजना में 6-7 मॉड्यूल (~ 2000 एलओसी) हैं, जिनमें से प्रत्येक में एकजुटता है जिसमें बेंचमार्क भी होते हैं।डी संकलन इतना लंबा क्यों लेता है?

dmd -O -noboundscheck0m1.287s

dmd -O -release -noboundscheck लेता लेता 0m1.382s

dmd -O -inline -noboundscheck लेता 0m1.499s

dmd -O -inline -release -noboundscheck0m3.477s

ऊपर इच्छा से किसी एक को -unittest जोड़ने लेता है: यहाँ मेरे वर्तमान परियोजना से कुछ नंबर दिए गए हैं कॉम्पी में भारी वृद्धि आबादी समय:

dmd -O -inline -release -noboundscheck -unittest0m21.918s

लेता है और कभी कभी यह दुर्घटनाओं डीएमडी:

time dmd -O t1.d -inline -noboundscheck -version=Double -unittest0m2.297s Internal error: ../ztc/gdag.c 776

Evidentially लेता है, unittest गाड़ी है, लेकिन एक ही समय में यह का एक महत्वपूर्ण हिस्सा बन गया है मेरी परियोजना। मैं जानना चाहता हूं कि मंदी सामान्य है या क्या ऐसा कुछ है जिस पर काम किया जा रहा है? मेरी परियोजना बढ़ रही है और प्रत्येक नए अवांछित के साथ संकलन लंबे और लंबे समय तक ले रहा है। मुझे पता है कि एकमात्र समाधान -release और -inline अक्षम करना है, लेकिन यह हमेशा वांछनीय नहीं है।

auto foo(T)(T t) { return t; } 

version(unittest) { 
    alias foo!int fooInt; 
} 

unittest { 
    auto x = fooInt(1); 
} 

इस रूपरेखा, मैं चारों ओर ~30msec गति सुधार मिल अगर मैं में aliased टेम्पलेट उदाहरण का उपयोग करें:

+0

क्या आपके पास अपने यूनिट परीक्षणों में कई टेम्पलेट तत्काल हैं? –

+0

@ साइबरशैडो हां, यह ज्यादातर टेम्पलेट इंस्टॉलेशन है क्योंकि बहुत सामान्य प्रोग्रामिंग है। – Arlen

+0

यह संभवतः कारण है। टेम्पलेट के बाहर अपने कोड के गैर-जेनेरिक भागों को स्थानांतरित करने का प्रयास करें। –

उत्तर

1

एक बहुत छोटे प्रदर्शन में सुधार मॉड्यूल-गुंजाइश के लिए टेम्पलेट इन्स्टेन्शियशन स्थानांतरित करने के लिए, एक version(unittest) block के माध्यम से, उदाहरण के लिए हो सकता है auto x = fooInt(1) के माध्यम से 5000 समतुल्य unittest ब्लॉक, auto x = foo(1) के माध्यम से सीधे प्रत्येक unittest ब्लॉक में इसे तुरंत चालू करने की तुलना में (यह वास्तव में auto x = foo!int(1) तक फैलता है)।

यह संभवतः उन मामलों के लिए काम करेगा जहां आपके पास बहुत सारे unittests हैं जो एक ही टेम्पलेट उदाहरण बनाते हैं।

+0

टेम्पलेट्स या जेनेरिक कोड को क्रैश करने के लिए – Arlen

+0

व्यक्तिगत रूप से मैं unittesting जब '-release' का उपयोग नहीं करते हैं। '-रली- किसी भी ऐसे आवेषण से छुटकारा पाता है जो मेरे पास हो सकता है जो मेरे unittests पास नहीं कर सकता है जब वे नहीं करना चाहिए। –

+1

@AndrejM। जब तक आप '-unittest' के साथ संकलित करते हैं, तब तक दावाों को हटाया नहीं जाता है, भले ही आप' -release' 'के साथ संकलित हों। –

4

डीएमडी ऑप्टिमाइज़ेशन के साथ एक ज्ञात मुद्दा है: long blocks of code optimise with an O(n^2) algorithm, इतने लंबे कार्यों को अनुकूलन के साथ संकलित करने में काफी समय लगता है।

अपने कोड को छोटे कार्यों में विभाजित करने का प्रयास करें और आपको इस दौरान बेहतर संकलन समय प्राप्त करना चाहिए। आप इनलाइन कार्यों का उपयोग करके काफी आसानी से यह कर सकते हैं:

void foo() 
{ 
    // lots of code 
    // more code 
} 

बारी इस में:

void foo() 
{ 
    void block1() 
    { 
     // lots of code 
    } 
    block1(); 

    void block2() 
    { 
     // more code 
    } 
    block2(); 
} 

यह मेरे लिए काम किया।

+0

मुझे लगता है कि आप घोंसला वाले कार्यों का मतलब है? –

0

मैंने अपने सामान्य जेनेरिक कोड को प्रतिस्थापित किया है, लेकिन यह केवल 4-5 सेकेंड तक संकलन समय को कम करता है।हालात बदतर हो गया है, और मेरा मानना ​​है कि संकलक शायद मुद्दा है:

time dmd -O -inline -release -noboundscheck -unittest लेता 0m30.388s

time dmd -O -inline -release -noboundscheck लेता 0m11.597s

time dmd -inline -release -noboundscheck -unittest0m1.884s

जब -O, -inline, -release, और -unittest हैं लेता है सभी सेट, संकलन सबसे लंबा लेता है। -O छोड़ने से संकलन समय कम हो जाता है। इसलिए, unittesting के दौरान संकलन समय को कम करने के लिए, अनुकूलन ध्वज ड्रॉप करें। सामान्य संकलन के लिए, आप किसी भी समस्या के बिना तीन (-inline, -release, -unittest) का उपयोग कर सकते हैं। मेरे अनुभव में, यह तीनों का संयोजन है जो संकलन को दूसरे सबसे लंबे समय तक ले जाने का कारण बनता है, और सबसे लंबा जब -unittest भी सेट किया जाता है।

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