c++ - शून्य निष्पादन समय के साथ लूप




optimization execution-time (3)

संकलक अभिव्यक्ति, या अभिव्यक्ति के एक हिस्से का मूल्यांकन करने के लिए बाध्य नहीं है, जिसका कोई दुष्प्रभाव नहीं है और जिसका परिणाम खारिज हो गया है।

हर्बिसन और स्टील, सी: एक संदर्भ मैनुअल

क्या एक लूप होना संभव है जिसके पास शून्य निष्पादन का समय है? मुझे लगता है कि एक खाली लूप का भी निष्पादन समय होना चाहिए क्योंकि इसके साथ एक ओवरहेड जुड़ा हुआ है।


कंपाइलर ऑप्टिमाइज़ेशन के साथ-साथ, कुछ सीपीयू आर्किटेक्चर, विशेष रूप से डीएसपी, में जीरो ओवरहेड लूपिंग होती है , जिससे निश्चित संख्या में पुनरावृत्तियों वाला एक लूप प्रभावी रूप से हार्डवेयर से दूर हो जाता है, उदाहरण के लिए देखें http://www.dsprelated.com/showmessage/20681/1.php


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

उदाहरण

उदाहरण के लिए निम्नलिखित कोड:

int main()
{
  int j = 0 ;
  for( int i = 0; i < 10000; ++i )
  {
    ++j ;
  }
}

gcc 4.9 साथ संकलित gcc 4.9 -O3 ध्वज का उपयोग मूल रूप से निम्नलिखित को कम करने के लिए समाप्त होता है ( इसे लाइव देखें ):

main:
  xorl  %eax, %eax  #
  ret

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

कुछ अन्य उदाहरणों में मृत कोड उन्मूलन शामिल होगा जो कोड को हटा सकता है जो संकलक साबित कर सकता है कि कभी भी निष्पादित नहीं किया जाएगा। उदाहरण के लिए, हालांकि निम्नलिखित लूप में वास्तव में एक साइड इफेक्ट होता है, इसे अनुकूलित किया जा सकता है क्योंकि हम यह साबित कर सकते हैं कि इसे कभी भी निष्पादित नहीं किया जाएगा ( इसे लाइव देखें ):

#include <stdio.h>

int main()
{
  int j = 0 ;
  if( false ) // The loop will never execute
  {
    for( int i = 0; i < 10000; ++i )
    {
      printf( "%d\n", j ) ;
      ++j ;
    }
  }
}

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

int j = 0 ;
for( int i = 0; i < 10000; ++i )
{
  ++j ;
}
printf( "%d\n", j ) ;

दूर अनुकूलित किया जा सकता है ( इसे लाइव देखें ):

movl    $10000, %esi    #,
movl    $.LC0, %edi #,
xorl    %eax, %eax  #
call    printf  #

हम देख सकते हैं कि कोई लूप शामिल नहीं है।

जहां के रूप में-अगर नियम मानक में शामिल किया गया है

जैसा कि अगर नियम C99 मानक खंड 5.1.2.3 के मसौदे में शामिल किया गया है, तो प्रोग्राम निष्पादन जो कहता है:

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

जैसे-यदि नियम C ++ पर भी लागू होता है, तो gcc C ++ मोड में भी समान परिणाम देगा। C ++ ड्राफ्ट मानक इसे धारा 1.9 कार्यक्रम निष्पादन में शामिल करता है :

इस अंतर्राष्ट्रीय मानक में शब्दार्थ विवरण एक मानकीकृत नॉनडेटर्मिनिस्टिक अमूर्त मशीन को परिभाषित करते हैं। यह अंतर्राष्ट्रीय मानक अनुरूप कार्यान्वयन की संरचना पर कोई आवश्यकता नहीं रखता है। विशेष रूप से, उन्हें अमूर्त मशीन की संरचना की नकल या अनुकरण करने की आवश्यकता नहीं है। बल्कि, अनुरूप कार्यान्वयन की आवश्यकता है (केवल) अमूर्त मशीन के अवलोकनीय व्यवहार के रूप में नीचे समझाया गया है






as-if