दिलचस्प पोस्ट
PHP से एक्सएमएल से खाली टैग निकालें जब कोई उपयोगकर्ता मानचित्र पर एक (व्यापार) स्थान पर क्लिक करता है तो एक क्लिक ईवेंट कैसे प्राप्त करें स्वीकार करने के लिए_अनुवादित_अस्तित्व_कमान के साथ के लिए polymorphic JQuery के साथ एक DIV पृष्ठभूमि छवि बदलना आधा – बाड़ और पूर्ण बाड़? सिस्टम। थ्रेडिंग। टास्क – समवर्ती कार्य की संख्या को सीमित करें क्लिक किए गए तत्व को कोणीयर्स में प्रवेश करना JsonValueProviderFactory फेंकता है "अनुरोध बहुत बड़ा है" एनएटी में विधानसभा बाँध विफलता प्रवेश (फ्यूजन) को कैसे सक्षम करें Instagram एपीआई सैंडबॉक्स उपयोगकर्ताओं के लिए किसी भी पसंदीदा पोस्ट नहीं मिलती तत्व मान के लिए एचटीएच-इक्विविट के लिए खराब मान X-UA- संगत रुबी में आप -> ऑपरेटर क्या कहते हैं? कैसे एमवीसी को IValidatableObject मान्य करने के लिए मजबूर किया जाए FB.logout () किसी पहुंच टोकन के बिना बुलाया क्या जावा में एक वर्ग है जो कि जुडा-टाइम अंतराल के बराबर है?

क्या 'var' का उपयोग प्रदर्शन को प्रभावित करेगा?

इससे पहले मैंने एक सवाल पूछा कि मैं क्यों कई उदाहरणों को var कीवर्ड का उपयोग कर देखता हूं और इसका उत्तर मिला कि यह केवल अनाम रूपों के लिए आवश्यक है, लेकिन फिर भी यह कोड 'तेज' / आसान और 'सिर्फ इसलिए' लिखने के लिए प्रयोग किया जाता है।

इस लिंक के बाद ("सी # 3.0 – var इब्ज़ेक नहीं है") मैंने देखा है कि var को आईएल में सही प्रकार से संकलित किया जाता है (आप उसे लेख के बीच में देखेंगे)।

मेरा प्रश्न यह है कि, यदि कोई भी, आईएल कोड var कीवर्ड का उपयोग करता है, और क्या यह कोड के प्रदर्शन पर एक औसत दर्जे का स्तर होने के करीब होगा, अगर यह हर जगह उपयोग किया जाता है?

Solutions Collecting From Web of "क्या 'var' का उपयोग प्रदर्शन को प्रभावित करेगा?"

var कीवर्ड के लिए कोई अतिरिक्त आईएल कोड नहीं है: परिणामस्वरूप आईएल गैर-अनाम प्रकार के समान होना चाहिए। यदि कंपाइलर उस आईएल को नहीं बना सकता है क्योंकि इसका पता नहीं हो सकता कि किस प्रकार का उपयोग करना है, आप एक कंपाइलर त्रुटि प्राप्त करेंगे।

केवल चाल यही है कि var सटीक प्रकार का अनुमान लगाएगा, जहां आपने इंटरफ़ेस या पेरेंट प्रकार चुना है यदि आप मैन्युअल रूप से प्रकार सेट करना चाहते हैं


8 साल बाद अपडेट करें

मेरी इसे समझने की आवश्यकता है क्योंकि मेरी समझ बदल गई है। मुझे अब विश्वास है कि यह संभव है कि वे स्थिति में प्रदर्शन को प्रभावित कर सकें, जहां एक पद्धति इंटरफ़ेस देता है, लेकिन आप एक सटीक प्रकार का उपयोग करते हैं। उदाहरण के लिए, यदि आपके पास यह विधि है:

 IList<int> Foo() { return Enumerable.Range(0,10).ToList(); } 

इस विधि को कॉल करने के लिए इन तीन पंक्तियों के कोड पर गौर करें:

 List<int> bar1 = Foo(); IList<int> bar = Foo(); var bar3 = Foo(); 

सभी तीन संकलन और अपेक्षित के रूप में निष्पादित। हालांकि, पहली दो पंक्तियां बिल्कुल समान नहीं हैं, और तीसरी पंक्ति पहले की तुलना में, दूसरे से मेल खाती है। क्योंकि Foo() के हस्ताक्षर एक IList<int> वापस करना है, इस प्रकार संकलक बार bar3 चर का निर्माण करेगा।

एक प्रदर्शन के दृष्टिकोण से, अधिकतर आप नोटिस नहीं करेंगे। हालांकि, ऐसी स्थितियां हैं जहां तीसरी पंक्ति का प्रदर्शन पहले के प्रदर्शन के रूप में तेज़ी से नहीं हो सकता है । जैसा कि आप बार bar3 वेरिएबल का इस्तेमाल करते bar3 , कम्पाइलर विधि कॉल को उसी तरह से प्रेषित करने में सक्षम नहीं हो सकता है।

ध्यान दें कि यह संभव है (संभावना भी है) जिटर इस अंतर को मिटाने में सक्षम हो जाएगा, लेकिन इसकी गारंटी नहीं है। आम तौर पर, आप अब भी var के प्रदर्शन के मामले में गैर-कारक होने पर विचार कर सकते हैं। यह निश्चित रूप से एक dynamic चर का उपयोग करने की तरह नहीं है लेकिन कहने के लिए यह कभी भी फर्क नहीं पड़ता है कि यह सब कुछ खत्म हो सकता है।

जैसा कि योएल कहते हैं, कंपाइलर संकलन-समय पर किस प्रकार के प्रकार होना चाहिए, प्रभावी ढंग से काम करता है, प्रभावी ढंग से यह सिर्फ एक चाल है जो कम्पाइलर कुंजीस्ट्रोक को सहेजने के लिए करता है, उदाहरण के लिए

 var s = "hi"; 

द्वारा प्रतिस्थापित किया जाता है

 string s = "hi"; 

किसी भी आईएल उत्पन्न होने से पहले संकलक द्वारा जनरेटेड आईएल बिल्कुल वैसा ही होगा यदि आप स्ट्रिंग टाइप करेंगे

जैसा कि कोई भी अभी तक परावर्तक उल्लेख नहीं किया है …

यदि आप निम्न C # कोड संकलित करते हैं:

 static void Main(string[] args) { var x = "hello"; string y = "hello again!"; Console.WriteLine(x); Console.WriteLine(y); } 

फिर उस पर परावर्तक का उपयोग करें, आपको मिलता है:

 // Methods private static void Main(string[] args) { string x = "hello"; string y = "hello again!"; Console.WriteLine(x); Console.WriteLine(y); } 

तो जवाब स्पष्ट रूप से कोई रनटाइम प्रदर्शन हिट नहीं है!

निम्नलिखित विधि के लिए:

  private static void StringVsVarILOutput() { var string1 = new String(new char[9]); string string2 = new String(new char[9]); } 

आईएल आउटपुट यह है:

  { .method private hidebysig static void StringVsVarILOutput() cil managed // Code size 28 (0x1c) .maxstack 2 .locals init ([0] string string1, [1] string string2) IL_0000: nop IL_0001: ldc.i4.s 9 IL_0003: newarr [mscorlib]System.Char IL_0008: newobj instance void [mscorlib]System.String::.ctor(char[]) IL_000d: stloc.0 IL_000e: ldc.i4.s 9 IL_0010: newarr [mscorlib]System.Char IL_0015: newobj instance void [mscorlib]System.String::.ctor(char[]) IL_001a: stloc.1 IL_001b: ret } // end of method Program::StringVsVarILOutput 

सी # संकलक संकलन के समय में चर के वास्तविक प्रकार का अनुमान लगाता है। उत्पन्न आईएल में कोई अंतर नहीं है I

तो, स्पष्ट होना, यह एक आलसी कोडन शैली है। मैं पसंद के अनुसार देशी प्रकार पसंद करता हूं; मैं यह सुनिश्चित करने के लिए कि मैं लिख रहा हूं और वास्तव में मुझे क्या लगता है कि मैं कोड / डीबग समय पर हूं, पढ़ने के लिए "शोर" का अतिरिक्त बिट लेता हूं। * श्राग *

मुझे नहीं लगता कि आप जो पढ़ते हैं वह ठीक से समझ में नहीं आ रहा है। अगर इसे सही प्रकार से संकलित किया जाता है, तो इसमें कोई अंतर नहीं है। जब मैं यह करता हूँ:

 var i = 42; 

कंपाइलर जानता है कि यह एक इंट है, और कोड जेनरेट करता है जैसा मैंने लिखा था

 int i = 42; 

जिस पोस्ट के साथ आप लिंक करते हैं, वह उसी प्रकार से संकलित हो जाता है यह एक रनटाइम चेक या अतिरिक्त कोड की आवश्यकता नहीं है। कंपाइलर बस बताता है कि किस प्रकार का होना चाहिए, और इसका उपयोग करता है।

Var का उपयोग करने के लिए कोई रनटाइम प्रदर्शन लागत नहीं है यद्यपि, मुझे संदेह होता है कि कंपाइलर की लागत का संकलन करने के लिए कंपाइलर की लागत का अनुमान लगाने की ज़रूरत है, हालांकि यह सबसे अधिक लापरवाह होगा।

यदि कंपाइलर स्वत: टाइप इनफ्रेंसिंग कर सकता है, तो प्रदर्शन के साथ कोई समस्या नहीं होगी। इनमें से दोनों एक ही कोड उत्पन्न करेंगे

 var x = new ClassA(); ClassA x = new ClassA(); 

हालांकि, यदि आप गतिशील रूप से (LINQ …) प्रकार का निर्माण कर रहे हैं तो var आपका एकमात्र सवाल है और यह कहने के लिए कि क्या दंड है, तुलना करने के लिए अन्य तंत्र है।

मैं वेब वर्ड या मार्गदर्शिका लेखन में हमेशा शब्द var का उपयोग करता हूं

ऑनलाइन लेख के टेक्स्ट एडिटर की चौड़ाई छोटी है

अगर मैं यह लिखता हूं:

 SomeCoolNameSpace.SomeCoolClassName.SomeCoolSubClassName coolClass = new SomeCoolNameSpace.SomeCoolClassName.SomeCoolSubClassName(); 

आप देखेंगे कि उपरोक्त पूर्व कोड टेक्स्ट बहुत लंबा है और बॉक्स से बाहर निकलता है, यह छिपा हुआ हो जाता है पाठक को पूरा वाक्यविन्यास देखने के लिए दाईं ओर स्क्रॉल करना होगा

इसीलिए मैं हमेशा वेब लेख लेखों में कीवर्ड वर्जन का उपयोग करता हूं

 var coolClass = new SomeCoolNameSpace.SomeCoolClassName.SomeCoolSubClassName(); 

पूरे गाया प्री कोड सिर्फ स्क्रीन के भीतर फिट है

व्यवहार में, वस्तु को घोषित करने के लिए, मैं शायद ही कभी var का उपयोग करता हूं, मैं वस्तु को तेजी से घोषित करने के लिए intellisense पर भरोसा करता हूँ।

उदाहरण:

 SomeCoolNamespace.SomeCoolObject coolObject = new SomeCoolNamespace.SomeCoolObject(); 

लेकिन, किसी विधि से ऑब्जेक्ट लौटने के लिए, मैं var को तेजी से कोड लिखने का उपयोग करता हूं

उदाहरण:

 var coolObject = GetCoolObject(param1, param2); 

"वेर" उन चीजों में से एक है जो लोग या तो प्यार करते हैं या नफरत करते हैं (जैसे क्षेत्रों)। हालाँकि, क्षेत्रों के विपरीत, वर्गाकारों को अनिवार्य कक्षाएं बनाते समय बिल्कुल जरूरी है।

मेरे लिए, जब आप एक ऑब्जेक्ट को सीधे पसंद करते हैं तो वार समझ में आता है:

 var dict = new Dictionary<string, string>(); 

कहा जा रहा है, आप आसानी से कर सकते हैं:

Dictionary<string, string> dict = नया और intellisense आपके लिए यहाँ आराम भर जाएगा

यदि आप केवल विशिष्ट अंतरफलक के साथ काम करना चाहते हैं, तो आप var का उपयोग नहीं कर सकते हैं जब तक कि आप कॉल करने वाली विधि इंटरफ़ेस सीधे वापस नहीं लौटे

रेशर "ओवर" का उपयोग करने के पक्ष में है, जो कि अधिक लोगों को इस तरह से करने के लिए धक्का दे सकता है। लेकिन मैं इस बात से सहमत हूं कि यदि आप किसी विधि को बुला रहे हैं तो यह पढ़ना कठिन है और यह स्पष्ट नहीं है कि नाम से क्या वापस किया जा रहा है।

वारा स्वयं किसी भी चीज़ को धीमा नहीं करता है, लेकिन इसके लिए एक चेतावनी है कि बहुत से लोगों को इसके बारे में नहीं सोचना पड़ता है यदि आप var result = SomeMethod(); तो उसके बाद का कोड कुछ प्रकार के परिणाम की उम्मीद कर रहा है जहां आप विभिन्न तरीकों या गुणों को फोन करते हैं या जो भी यदि कुछ SomeMethod() ने अपनी परिभाषा किसी अन्य प्रकार से बदल दी है, लेकिन यह अभी भी संविदा को दूसरे कोड की उम्मीद कर रहा है, तो आपने वास्तव में एक गंदा बग बनाया है (यदि कोई यूनिट / एकीकरण परीक्षण, बिल्कुल नहीं)।