2011-02-03 10 views
11

मैं अभी एक प्रोग्राम का परीक्षण कर रहा हूं जिसे मैं काम कर रहा हूं, और मुझे लगता है कि यह 3μs तेजी से निष्पादित कर रहा है (एक सांख्यिकीय रूप से महत्वपूर्ण परिवर्तन) जब मैं इसे संकलित करता हूं -जी। इससे मुझे कोई समझ नहीं आती - मैंने सोचा कि -जी ध्वज प्रोग्राम निष्पादन को प्रभावित नहीं करना चाहिए था, और यह भी कि अगर ऐसा होता है तो यह धीमा, तेज नहीं होगा।क्या gcc -g डीबगिंग ध्वज प्रोग्राम निष्पादन को प्रभावित करता है?

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

इसलिए मुझे यह जानने की ज़रूरत है कि कार्यक्रम में -जी ध्वज क्या बदलता है।

संपादित करें: जितना अधिक परीक्षण मैं चलाता हूं, टी-वैल्यू जितना बड़ा हो जाता है (= अधिक सांख्यिकीय रूप से महत्वपूर्ण अंतर बन जाता है)। यह निश्चित रूप से माप त्रुटि नहीं है - कुछ चल रहा है।

+0

इसके अलावा: अगर -जी हमेशा प्रोग्राम चलाता है, तो यह डिफ़ॉल्ट रूप से चालू होगा, तो मेरा प्रोग्राम विशेष क्या हो सकता है? – Benubird

+5

क्या 3us वास्तव में एक सांख्यिकीय रूप से महत्वपूर्ण परिवर्तन है? यह उस दर के करीब है जिस पर सिस्टम घड़ी सटीक है, और अगर मैं यादृच्छिक शोर के अलावा कुछ और आश्चर्यचकित हूं तो मुझे आश्चर्य होगा। – templatetypedef

+0

यह है। प्रत्येक संस्करण के 1000 से अधिक परीक्षण, टी आंकड़े 1.8 के साथ 1.8 है। यह लगभग 9 5% महत्वपूर्ण है। – Benubird

उत्तर

10

जैसा कि अन्य ने कहा है, डिबगिंग प्रतीक आपके कोड के नियंत्रण प्रवाह को तब तक नहीं बदलेंगे जब तक कि कंपाइलर में कोई (असंभव) बग न हो।

यह निष्पादन में परिवर्तन करता है, हालांकि, निष्पादन योग्य बड़ा हो जाता है, और निष्पादित कोड अधिक पृष्ठों पर अधिक व्यापक रूप से फैलता है। आप अधिक कैश मिस और आईओ सिग्नल की उम्मीद कर सकते हैं। एक बहु-कार्य वातावरण पर (और यहां तक ​​कि एक लिनक्स/व्यस्त बॉक्स सिस्टम भी ऐसी चीज है) इसका परिणाम थोड़ा अलग शेड्यूलिंग व्यवहार हो सकता है।

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

+0

यह समझ में आता है। लेकिन, मिश कैश नहीं करेंगे निष्पादन धीमा, तेजी से नहीं? – Benubird

+0

@ बेनबर्ड: सबसे पहले माप को परेशान करें। –

+0

@ जेन्स मुझे खेद है, मैं अभी भी पालन नहीं करता हूं। कैसे कैश मिस निष्पादन समय कम कर सकता है? – Benubird

7

-g ध्वज वास्तविक जेनरेट कोड में 0 परिवर्तन करता है। यह निष्पादन योग्य में डीबग अनुभाग जोड़ता है। वे अनुभाग रनटाइम पर लोड नहीं होते हैं, लेकिन डिबगर्स उन्हें लोड कर सकते हैं। चूंकि निष्पादन योग्य अब थोड़ा अलग है, यह बड़ा है - आप ट्यून संख्या को मापने का प्रयास कर सकते हैं। पृष्ठ दोषों का एक संस्करण बनाम एक संस्करण के साथ चल रहा है। डिस्क में निष्पादन योग्य कैसे संग्रहीत किया जाता है, इसमें कोई परिवर्तन नहीं होगा, लेकिन कोई कोड नहीं बदलेगा।

आप विधानसभा देखते हैं, अपने द्विआधारी पर -d objdump चलाने के लिए और तुलना करने के लिए चाहते हैं

मैं हालांकि 3us वृद्धि की वैधता पर सवाल खड़ा करते हैं, मज़बूती से, 3us मापने कम से कम एक सामान्य प्रयोजन ओएस पर एक कठिन है कार्य - मुझे उम्मीद है कि इस तरह के माप को प्रभावित करने वाली सभी यादृच्छिक चीजों को खत्म करने की कोशिश करने के लिए आपने उस संख्या के साथ आने के लिए कुछ हज़ार बार (संभवतः कुछ सौ हजार बार) भाग लिया है।

+0

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

1

जब मैं subroutines में से एक पर -debug और -g झंडे का उपयोग करता हूं, तो मुझे अपने कोड के साथ एक अलग उत्तर मिल रहा है, हालांकि मुझे नहीं पता कि क्यों, यह निश्चित रूप से प्रोग्राम निष्पादन को प्रभावित कर रहा है।

+0

यह प्रश्न का उत्तर नहीं देता है। लेखक से स्पष्टीकरण की आलोचना या अनुरोध करने के लिए, अपनी पोस्ट के नीचे एक टिप्पणी छोड़ दें। – osyan

+3

यदि आप एक निश्चित कर्म सीमा से नीचे हैं तो आप टिप्पणी नहीं कर सकते (100 मुझे विश्वास है) – Michael

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