2016-10-24 9 views
5

ऑप्टिमाइज़ेशन और शाखा भविष्यवाणियों के दृष्टिकोण से, क्या उन दो कोडों के बीच कोई अंतर है?शाखा के साथ एक फ़ंक्शन शुरू करना

पहले:

void think_and_do(){ 
    if(expression){ 
     //Set_A of instructions 
    } 
    else{ 
     //Set_B of instructions 
    } 
} 

int main(){ 
    think_and_do(); 
} 

दूसरा:

void do_A(){ 
    //Set_A of instructions 
} 

void do_B(){ 
    //Set_B of instructions 
} 

int main(){ 
    if(expression){ 
     do_A(); 
    } 
    else{ 
     do_B(); 
    } 
} 
+4

मुझे लगता है कि आपको एक ही कोड मिल जाएगा लेकिन यह संकलक पर अनुकूलन सेटिंग्स पर निर्भर करता है। आप दोनों संकलित कर सकते हैं और असेंबली की जांच कर सकते हैं। – NathanOliver

+1

यह एक सवाल है जो अनुभवी उत्तर दिया गया है। कुछ दोहराने योग्य छद्म-यादृच्छिक डेटा पर कुछ मिलियन बार फिर से शुरू करें, और [इसे मापें] (http://stackoverflow.com/questions/11437523/can-i-measure-branch- भविष्यवाणी- विफलताओं-on-a- आधुनिक-intel कोर-cpu? RQ = 1)। – dlatikay

+1

एक कुंजी दोनों कार्यों के लिए आवश्यक पैरामीटर की संख्या हो सकती है। सबसे पहले फंक्शन 'think_and_do()' को सभी पैरामीटर और दूसरे मामले के लिए आवश्यक था, केवल 'd__() 'या' do_B()' को सभी मानकों की आवश्यकता होती है (आमतौर पर जब 'do_A()' कोई ऑब्जेक्ट बनाता है और 'do_B() 'इस वस्तु को हटा देता है)। –

उत्तर

3

मैं अपने उदाहरण यदि think_and_do godbolt.org पर और main

पहले अवलोकन में एक परीक्षण करने के बाद, वे छोटे हैं वे ज्यादातर अनुकूलित अनुकूलित हो जाते हैं। cin बिना दोनों उदाहरण संकलित किया है चाहिए रहे हैं:

xor  eax, eax 
    add  rsp, 8 #may or may not be present. 
    ret 

दूसरा अवलोकन है कि कोड वास्तव में मुख्य में एक ही है: और कार्यों में से कोई भी कहा जाता है, सब कुछ inlined है।

तीसरा अवलोकन है कि दोनों उदाहरण निम्नलिखित कोड

mov  edx, DWORD PTR a[rip] 
    mov  eax, DWORD PTR b[rip] 
    cmp  edx, eax 
    je  .L8 

है यही कारण है कि वे एक 4 शिक्षा का चक्र को भरने (जारी करने का सबसे बनाने के लिए और सीएमपी और कूद के वृहद संलयन की संभावना की अनदेखी करने के बनाता है)।

यदि वह समस्या बैंडविड्थ की एक

cmp  edx, eax 
    je  .L8 

आधा साथ शुरू किया था संभावित बर्बाद हो गया होता।

+1

मुझे लगता है कि बिंदु उन मामलों के बारे में था जहां आप फ़ंक्शन – Leeor

+0

@Loror को इनलाइन नहीं कर सकते हैं और निष्कर्ष यह है कि संकलक आपके लिए इनलाइन करता है भले ही आप इसे निर्दिष्ट न करें, जिससे इससे कोई फर्क नहीं पड़ता। – Surt

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