मैं Lazy<T>
अपने स्वयं के कोड के प्रदर्शन को बेहतर बनाने में मदद करने के लिए (और इसके बारे में थोड़ा और जानने के लिए) गुणों का उपयोग करने पर विचार कर रहा हूं । मैं इसका उपयोग करने के बारे में उत्तरों की तलाश में यहां आया था लेकिन ऐसा लगता है कि हर जगह मैं वहां जाता हूं जैसे वाक्यांश:
किसी बड़ी या संसाधन-गहन वस्तु के निर्माण को टालने के लिए, या संसाधन-गहन कार्य के निष्पादन के लिए आलसी आरंभीकरण का उपयोग करें, खासकर जब प्रोग्राम के जीवनकाल में ऐसा निर्माण या निष्पादन नहीं हो सकता है।
से MSDN लेज़ी <टी> कक्षा
मैं थोड़ा उलझन में हूं क्योंकि मुझे यकीन नहीं है कि रेखा कहां खींचनी है। उदाहरण के लिए, मैं रेखीय प्रक्षेप को काफी त्वरित संगणना मानता हूं लेकिन अगर मुझे ऐसा करने की आवश्यकता नहीं है तो आलसी आरंभीकरण मुझे इसे करने से बचने में मदद कर सकता है और क्या यह इसके लायक है?
अंत में मैंने अपना खुद का परीक्षण करने का फैसला किया और मुझे लगा कि मैं यहां परिणाम साझा करूंगा। दुर्भाग्य से मैं वास्तव में इस तरह के परीक्षण करने में विशेषज्ञ नहीं हूं और इसलिए मुझे उन टिप्पणियों को प्राप्त करने की खुशी है जो सुधार का सुझाव देते हैं।
विवरण
मेरे मामले के लिए, मुझे यह देखने में विशेष रूप से दिलचस्पी थी कि क्या आलसी गुण मेरे कोड के एक हिस्से को बेहतर बनाने में मदद कर सकता है जो बहुत अधिक प्रक्षेप करता है (ज्यादातर इसका अप्रयुक्त होना) और इसलिए मैंने एक परीक्षण बनाया है जिसमें 3 दृष्टिकोणों की तुलना की गई है।
मैंने प्रत्येक दृष्टिकोण के लिए 20 परीक्षण गुणों (उन्हें टी-गुण कहते हैं) के साथ एक अलग परीक्षण वर्ग बनाया।
- GetInterp क्लास: हर बार एक टी-प्रॉपर्टी मिलने पर लीनियर इंटरपोलेशन चलता है।
- InitInterp क्लास: कंस्ट्रक्टर में प्रत्येक के लिए रैखिक प्रक्षेप को चलाकर टी-गुणों को आरम्भ करता है । यह रिटर्न सिर्फ दोगुना मिलता है।
- InitLazy Class: टी-प्रॉपर्टीज़ को Lazy प्रॉपर्टीज़ के रूप में सेट करता है ताकि प्रॉपर्टी मिलते ही लीनियर इंटरपोलेशन एक बार चला जाए। बाद में हो जाता है बस एक पहले से ही गणना की दोहरी वापसी चाहिए।
परीक्षण के परिणाम एमएस में मापा जाता है और 50 इंस्टेंटिएशन या 20 संपत्ति प्राप्त करने का औसत होता है। प्रत्येक परीक्षण तब 5 बार चलाया गया था।
टेस्ट 1 परिणाम: इंस्टेंटिएशन (औसतन 50 इंस्टेंटिएशन)
Class 1 2 3 4 5 Avg %
------------------------------------------------------------------------
GetInterp 0.005668 0.005722 0.006704 0.006652 0.005572 0.0060636 6.72
InitInterp 0.08481 0.084908 0.099328 0.098626 0.083774 0.0902892 100.00
InitLazy 0.058436 0.05891 0.068046 0.068108 0.060648 0.0628296 69.59
टेस्ट 2 के परिणाम: पहला स्थान (औसतन 20 संपत्ति मिलती है)
Class 1 2 3 4 5 Avg %
------------------------------------------------------------------------
GetInterp 0.263 0.268725 0.31373 0.263745 0.279675 0.277775 54.38
InitInterp 0.16316 0.161845 0.18675 0.163535 0.173625 0.169783 33.24
InitLazy 0.46932 0.55299 0.54726 0.47878 0.505635 0.510797 100.00
परीक्षण 3 परिणाम: दूसरा प्राप्त (औसत 20 संपत्ति मिलता है)
Class 1 2 3 4 5 Avg %
------------------------------------------------------------------------
GetInterp 0.08184 0.129325 0.112035 0.097575 0.098695 0.103894 85.30
InitInterp 0.102755 0.128865 0.111335 0.10137 0.106045 0.110074 90.37
InitLazy 0.19603 0.105715 0.107975 0.10034 0.098935 0.121799 100.00
टिप्पणियों
GetInterp
उम्मीद के अनुसार सबसे तेज है क्योंकि कुछ भी नहीं कर रहा है। InitLazy
यह InitInterp
सुझाव देने की तुलना में त्वरित करने के लिए तेज़ है कि आलसी गुणों को स्थापित करने में ओवरहेड मेरी रैखिक प्रक्षेप गणना की तुलना में तेज़ है। हालाँकि, मैं यहाँ थोड़ा उलझन में हूँ क्योंकि InitInterp
20 लीनियर इंटरपोलेशन करना चाहिए (इसे टी-प्रॉपर्टीज़ सेट करने के लिए) लेकिन यह केवल 0.09 ms को तुरंत (टेस्ट 1) ले रहा है, जिसकी तुलना में GetInterp
सिर्फ एक रैखिक इंटरपोल करने के लिए 0.28 ms लगते हैं। पहली बार (परीक्षण 2), और दूसरी बार (परीक्षण 3) करने के लिए 0.1 एमएस।
यह लेता है InitLazy
लगभग 2 बार से अधिक समय GetInterp
एक संपत्ति के लिए पहली बार प्राप्त करने के लिए है, जबकि InitInterp
, सबसे तेजी से है, क्योंकि यह इन्स्टेन्शियशन दौरान उसके गुण आबादी। (कम से कम यह है कि यह क्या किया जाना चाहिए था, लेकिन यह एक एकल रैखिक प्रक्षेप की तुलना में तात्कालिकता परिणाम इतना तेज क्यों था? जब वास्तव में यह इन प्रक्षेप कर रहा है?)
दुर्भाग्य से ऐसा लगता है कि मेरे परीक्षणों में कुछ स्वचालित कोड अनुकूलन चल रहा है। GetInterp
किसी संपत्ति को पहली बार प्राप्त करने के लिए उसी समय लेना चाहिए जैसा कि वह दूसरी बार करता है, लेकिन यह 2x से अधिक तेजी से दिखा रहा है। ऐसा लगता है कि यह अनुकूलन अन्य वर्गों को भी प्रभावित कर रहा है क्योंकि वे सभी परीक्षण 3 के लिए समान समय ले रहे हैं। हालांकि, इस तरह के अनुकूलन मेरे स्वयं के उत्पादन कोड में भी हो सकते हैं जो एक महत्वपूर्ण विचार भी हो सकता है।
निष्कर्ष
जबकि कुछ परिणाम अपेक्षित हैं, कोड अनुकूलन के कारण संभवतः कुछ बहुत ही अप्रत्याशित अप्रत्याशित परिणाम भी हैं। यहां तक कि ऐसी कक्षाओं के लिए जो यह देखते हैं कि वे निर्माणकर्ता में बहुत काम कर रहे हैं, तात्कालिक परिणाम बताते हैं कि वे अभी भी एक डबल संपत्ति प्राप्त करने की तुलना में बनाने में बहुत तेज हो सकते हैं। हालांकि इस क्षेत्र के विशेषज्ञ अधिक अच्छी तरह से टिप्पणी करने और जांच करने में सक्षम हो सकते हैं, मेरी व्यक्तिगत भावना यह है कि मुझे इस परीक्षण को फिर से करने की आवश्यकता है, लेकिन मेरे उत्पादन कोड पर यह जांचने के लिए कि वहां किस प्रकार के अनुकूलन हो सकते हैं। हालाँकि, मैं उम्मीद कर रहा हूँ कि InitInterp
जाने का रास्ता हो सकता है।
get { if (foo == null) foo = new Foo(); return foo; }
। और इसका उपयोग करने के लिए संभावित स्थानों के zillions हैं ...