2012-08-01 10 views
8

मैं सोच रहा था कि भाषाओं में कोई बड़ा प्रदर्शन अंतर है, चाहे आपको if में या else खंड में कोड निष्पादित करने की अधिक संभावना हो। यहाँ एक उदाहरण है:यदि और, क्या मुझे अधिक संभावित हिस्सा रखना चाहिए?

// x is a random number, or some key code from the user 
if(!somespecific_keycode) 
    do the general stuff 
else 
    do specific stuff 

और अन्य समाधान

if(somespecific_keycode) 
    do the specific stuff 
else 
    do general stuff 
+0

कि संकलक पर निर्भर है, संकलक संस्करण, अनुकूलन विकल्प चुनते हैं और कभी-कभी सिर्फ मौसम। लेकिन 99.9 99% सभी वास्तविक दुनिया के मामलों में मैं सोच सकता हूं कि आपको शायद कोई फर्क नहीं पड़ता। –

+0

** नैनोसेन्ड्स के पैमाने पर एक प्रदर्शन अंतर होगा! ** यह सुपरमैन को छोड़कर किसी के लिए ध्यान देने योग्य नहीं होगा। – Marlon

उत्तर

6

उन्हें आदेश है कि कोड साफ है, जो आमतौर पर अधिक पहले निष्पादित किए जाने की संभावना हो रही है बनाता में डालने के लिए पसंद करते हैं।

+2

पूरी तरह से इस उत्तर का समर्थन। विस्तृत कोडिंग सम्मेलनों वाले अच्छे संगठनों में इसे –

+0

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

1

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

3

जब तक आप एक प्रदर्शन समस्या का अनुभव नहीं करते हैं, तो इसके बारे में चिंता न करें।

यदि आपको प्रदर्शन की समस्या का अनुभव होता है, तो उन्हें चारों ओर स्विच करने का प्रयास करें और माप जो भिन्नता है, उनमें से कोई भी तेज़ है।

1

आम नियम सबसे पहले संभावित मामले डालना है, इसे और अधिक पठनीय माना जाता है।

0

यह ज्यादातर एक फर्क नहीं करता, लेकिन कभी कभी यह पढ़ सकते हैं और डिबग करने के लिए करता है, तो अगर कुछ सच है या बराबर है और बाकी संभालती है जब कि ऐसा नहीं है अपने भारतीय विदेश सेवा की जाँच कर रहे आसान है।

0

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

यह अधिक स्पष्ट हो जाता है जब आप कई और होने पर शुरू करते हैं।

7

दूसरों के रूप में कहा: प्रदर्शन के मामले में आप सबसे अच्छा सही काम करने के लिए अपने संकलक और अपने हार्डवेयर (शाखा भविष्यवाणी, सट्टा निष्पादन) पर भरोसा करना चाहिए।

यदि आप वास्तव में चिंतित हैं कि ये दोनों आपको पर्याप्त मदद नहीं करते हैं, तो जीसीसी builtin (__builtin_expect) प्रदान करता है जिसके साथ आप स्पष्ट रूप से शाखा के अनुमानित परिणाम को इंगित कर सकते हैं।

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

+0

मैंने इस जवाब को वोट दिया, और यह बेहतर होगा कि आपने __builtin_expect का उपयोग कैसे किया और उदाहरण दिया। –

+0

जो केवल गणना करता है, जब संकलक जानता है कि कौन सा संभावित है, जब उपयोगकर्ता इनपुट की बात आती है, तो प्रोग्रामर सबसे अच्छा जानता है कि उपयोगकर्ता –

+0

चुनने का सबसे अधिक संभावित विकल्प क्या है I__builtin_expect() के लिए एक उदाहरण जो मैंने लिंक किया है, में पाया जा सकता है सेवा मेरे। – BjoernD

0

कोई अंतर यह है कि उत्पन्न हो सकती है if-else निर्माण के साथ स्वाभाविक से संदर्भ से अधिक संबंधित है। तो सबसे अच्छा आप यहां कर सकते हैं किसी भी अंतर का पता लगाने के लिए अपने स्वयं के परीक्षण विकसित करना है।

जब तक कि आप पहले से ही समाप्त सिस्टम या सॉफ़्टवेयर को अनुकूलित नहीं कर रहे हैं, तो मैं आपको सलाह दूंगा कि समयपूर्व अनुकूलन से बचें। शायद आप पहले से ही सुना है कि वे बुरा हैं।

0

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

इसलिए

:

  • का अनुकूलन नहीं है जब तक आप इस कोड से संबंधित

  • आप अनुकूलन करते हैं, को मापने और तुलना विभिन्न संस्करणों

  • की यथार्थवादी डेटा का उपयोग खराब प्रदर्शन को देखने के प्रदर्शन माप के लिए विभिन्न विशेषताओं

  • असेंबली कोड जेनरेट देखें दोनों मामलों में अपने कंपाइलर द्वारा डी।

0

यह आवश्यक रूप से एक प्रदर्शन चिंता का विषय नहीं है, लेकिन मैं आम तौर पर इस तरह के मामलों को रोकने के लिए सामान्य करने के लिए विशिष्ट से जाना:

int i = 15; 

if(i % 3 == 0) 
    System.out.println("fizz"); 
else if(i % 5 == 0) 
    System.out.println("buzz"); 
else if(i % 3 == 0 && i % 5 == 0) 
    System.out.println("fizzbuzz"); 

यहाँ उपरोक्त कोड का कहना है कि कभी नहीं होगा 'fizzbuzz' है, क्योंकि 15 i % 3 == 0 और i % 5 == 0 दोनों स्थितियों से मेल खाता है। आप कुछ और अधिक विशिष्ट में फिर से आदेश हैं:

int i = 15; 

if(i % 3 == 0 && i % 5 == 0) 
    System.out.println("fizzbuzz"); 
else if(i % 3 == 0) 
    System.out.println("fizz"); 
else if(i % 5 == 0) 
    System.out.println("buzz"); 

अब उपरोक्त कोड अधिक सामान्य स्थिति

0

सभी उत्तरों वैध अंक से बंद कर दिया हो रहा से पहले तक पहुंच जाएगा "fizzbuzz"। यहाँ एक अतिरिक्त एक है:

  • डबल negations से बचें: अगर नहीं इस, तो वह कुछ और पाठक के लिए भ्रमित हो जाता है। इसलिए दिए गए उदाहरण के लिए, मैं एहसान होगा:

    if (somespecific_keycode) { 
        do_the_specific_stuff(); 
    } else { 
        do_general_stuff(); 
    } 
    
संबंधित मुद्दे