संपादित करें:
एक उदाहरण जोड़ा जो कि इफ-स्टेटमेंट के साथ किया जा सकता है लेकिन सशर्त ऑपरेटर के साथ नहीं।
उत्तर देने से पहले, कृपया देखें [ कौन सा तेज है? ] श्री लिपर्ट के ब्लॉग पर। और मुझे लगता है कि श्री एर्सोन्मेज़ का उत्तर यहाँ सबसे सही है।
मैं एक ऐसी चीज का उल्लेख करने की कोशिश कर रहा हूं जिसे हमें उच्च स्तरीय प्रोग्रामिंग भाषा के साथ ध्यान में रखना चाहिए।
सबसे पहले, मैंने कभी नहीं सुना है कि सशर्त ऑपरेटर को तेज होना चाहिए या C♯ में स्टेटमेंट- इफ -स्टेटमेंट के साथ समान प्रदर्शन करना चाहिए ।
कारण सरल है कि क्या होगा अगर कोई-और-कथन के साथ कोई ऑपरेशन नहीं है:
if (i > 0)
{
value += 2;
}
else
{
}
सशर्त ऑपरेटर की आवश्यकता है दोनों ओर के साथ एक मूल्य होना चाहिए , और C also में यह भी आवश्यक है कि दोनों पक्ष :
एक ही प्रकार के हों। यह सिर्फ इफ-स्टेटमेंट से अलग बनाता है। इस प्रकार आपका प्रश्न यह प्रश्न बन जाता है कि मशीन कोड का निर्देश कैसे उत्पन्न किया जाता है ताकि प्रदर्शन का अंतर।
सशर्त ऑपरेटर के साथ, शब्दार्थ:
जो भी अभिव्यक्ति का मूल्यांकन किया जाता है, उसका एक मूल्य होता है।
लेकिन अगर-और बयान के साथ:
यदि अभिव्यक्ति का मूल्यांकन सही है, तो कुछ करें; यदि नहीं, तो दूसरी बात करें।
जरूरी नहीं कि इफ-स्टेटमेंट के साथ कोई मूल्य शामिल हो। आपका अनुमान अनुकूलन के साथ ही संभव है।
उनके बीच अंतर प्रदर्शित करने के लिए एक और उदाहरण निम्नलिखित होगा:
var array1=new[] { 1, 2, 3 };
var array2=new[] { 5, 6, 7 };
if(i>0)
array1[1]=4;
else
array2[2]=4;
संकलन के ऊपर कोड, हालांकि, सशर्त ऑपरेटर के साथ सिर्फ-और बयान को संकलित नहीं करेगा:
var array1=new[] { 1, 2, 3 };
var array2=new[] { 5, 6, 7 };
(i>0?array1[1]:array2[2])=4; // incorrect usage
सशर्त ऑपरेटर और अगर-जैसे कथन वैचारिक रूप से समान होते हैं जब आप एक ही काम करते हैं, तो संभवतः यह सशर्त ऑपरेटर C में भी तेजी से होता है , क्योंकि सी प्लेटफ़ॉर्म की विधानसभा के अधिक करीब है।
आपके द्वारा प्रदान किए गए मूल कोड के लिए, सशर्त ऑपरेटर का उपयोग फॉर्च-लूप में किया जाता है, जो चीजों को उनके बीच के अंतर को देखने के लिए गड़बड़ कर देगा। इसलिए मैं निम्नलिखित कोड प्रस्तावित कर रहा हूं:
public static class TestClass {
public static void TestConditionalOperator(int i) {
long value=0;
value+=i>0?2:3;
}
public static void TestIfElse(int i) {
long value=0;
if(i>0) {
value+=2;
}
else {
value+=3;
}
}
public static void TestMethod() {
TestConditionalOperator(0);
TestIfElse(0);
}
}
और निम्नलिखित अनुकूलित और नहीं के आईएल के दो संस्करण हैं। चूंकि वे लंबे हैं, मैं दिखाने के लिए एक छवि का उपयोग कर रहा हूं, दाहिने हाथ की तरफ एक अनुकूलित है:
(पूर्ण आकार वाले चित्र को देखने के लिए क्लिक करें।)
कोड के दोनों संस्करण में, सशर्त ऑपरेटर का IL, if- स्टेटमेंट की तुलना में छोटा दिखता है, और मशीन कोड के अंत में उत्पन्न होने का संदेह अभी भी है। निम्नलिखित दोनों विधि के निर्देश हैं, और पूर्व छवि गैर-अनुकूलित है, बाद वाला एक अनुकूलित है:
उत्तरार्द्ध में, पीले ब्लॉक कोड को केवल निष्पादित किया जाता है यदि i<=0
, और नीला ब्लॉक कब है i>0
। निर्देशों के किसी भी संस्करण में, if-else कथन छोटा है।
ध्यान दें कि, विभिन्न निर्देशों के लिए, [ सी.पी.आई. ] जरूरी नहीं है। तार्किक रूप से, समान निर्देश के लिए, अधिक निर्देशों की लागत लंबी चक्र है। लेकिन अगर निर्देश प्राप्त करने का समय और पाइप / कैश को भी ध्यान में रखा जाता है, तो निष्पादन का वास्तविक कुल समय प्रोसेसर पर निर्भर करता है। प्रोसेसर शाखाओं की भविष्यवाणी भी कर सकता है।
आधुनिक प्रोसेसर में और भी अधिक कोर हैं, चीजें इसके साथ अधिक जटिल हो सकती हैं। यदि आप एक इंटेल प्रोसेसर उपयोगकर्ता थे, तो आप [ Intel® 64 और IA-32 आर्किटेक्चर ऑप्टिमाइज़ेशन रेफरेंस मैनुअल] को देख सकते हैं ] [] को देख सकते हैं।
मुझे नहीं पता कि हार्डवेयर-कार्यान्वित सीएलआर था, लेकिन यदि हाँ, तो आप शायद सशर्त ऑपरेटर के साथ तेज़ हो सकते हैं क्योंकि आईएल स्पष्ट रूप से कम है।
नोट: सभी मशीन कोड x86 के हैं।
DateTime
प्रदर्शन को मापने के लिए उपयोग न करें । का उपयोग करेंStopwatch
। अगला, अधिक समय नहीं - यह मापने के लिए बहुत कम समय है।