2012-04-16 11 views
5

मैं पिछले 4 महीनों से वेब प्रोजेक्ट पर काम कर रहा हूं। कोड प्रदर्शन को अनुकूलित करने के लिए हमने एक पैटर्न का उपयोग किया है। मेरा शक है, क्या यह वास्तव में प्रदर्शन को बढ़ावा देता है या नहीं?जावास्क्रिप्ट इस ऑब्जेक्ट

जब हमें कभी भी this ऑब्जेक्ट का उपयोग करना होता है तो हम इसे स्थानीय चर में निर्दिष्ट करते हैं, और इसका उपयोग करते हैं।

function someFunction() 
{ 
    var thisObject = this; 
    //use thisObject in all following the code. 
} 

धारणा है कि यहाँ एक स्थानीय ढेर चर को this वस्तु बताए प्रदर्शन को बढ़ाने जाएगा।

मैंने इस प्रकार के कोडिंग को कहीं भी नहीं देखा है, इसलिए संदेह है कि इसका कोई उपयोग नहीं है।

संपादित करें: मुझे पता है कि इस ऑब्जेक्ट को स्थानीय चर पर असाइन करना ऑब्जेक्ट को संरक्षित करने के लिए किया जाता है, लेकिन यह हमारा मामला नहीं है।

+1

यह नोड.जेएस सामान में बेहद आम है। लेकिन कॉलबैक में संदर्भ रखने के लिए यह और अधिक है, क्योंकि मेरा मानना ​​है कि प्रदर्शन में वृद्धि के विपरीत। – Chad

+1

मुझे लगता है कि यह वास्तव में प्रदर्शन के लिए * बदतर * है। Google क्लोजर कंपाइलर (उन्नत ऑप्टिमाइज़ेशन के साथ) विभिन्न घोषणाओं को हटा देगा और 'thisObject' के उदाहरणों को 'इस' के साथ प्रतिस्थापित करेगा, भले ही एक चर का उपयोग करने से अक्सर एक छोटा सा छोटा आकार हो। क्लोजर कंपाइलर गति और आकार के लिए अनुकूलित करता है, लेकिन जब इसकी पसंद होती है तो आकार के ऊपर गति का पक्ष लेना प्रतीत होता है। –

उत्तर

7

हालांकि यह जावास्क्रिप्ट में एक आम प्रथा है, यह प्रदर्शन कारणों से नहीं किया गया है। किसी अन्य नामित स्थानीय में this ऑब्जेक्ट की बचत आमतौर पर फ़ंक्शन के भीतर परिभाषित कॉलबैक में this के मान को संरक्षित करने के लिए की जाती है।

function someFunction() { 
    var thisObject = this; 
    var someCallback = function() { 
    console.log(thisObject === this); // Could print true or false 
    }; 
    return someCallback; 
} 

किया जाए या नहीं thisObject === this सही का आकलन है कि यह कैसे

var o = {} 
o.someFunction = someFunction(); 
var callback = o.someFunction(); 
callback();  // prints false 
callback.call(o); // prints true 
+0

हमने इस पैटर्न का उपयोग सरल कार्यों में किया है जिसमें कोई कॉलबैक नहीं है या नहीं। मैं क्या जानना चाहता हूं क्या इसमें कोई प्रदर्शन बढ़ावा है? –

+0

@TejeshAlimilli यह बहुत ही असंभव है कि इसमें कोई उल्लेखनीय प्रदर्शन अंतर – JaredPar

+0

धन्यवाद है। यही वह है जिसे मैं जानना चाहता था। –

0

यहां तक ​​कि जब अनुकूलन के इस प्रकार एक (सकारात्मक) प्रभाव पड़ता है कहा जाता है पर निर्भर करेगा, यह बहुत दुभाषिया पर निर्भर होने की संभावना है।

एक अन्य रिलीज परिणाम वापस कर सकता है।

हालांकि, अंत में आपको मापना चाहिए, अनुमान नहीं लगाया जाना चाहिए।

2

सभी प्रदर्शन प्रश्नों के साथ, वास्तव में प्रदर्शन को मापकर उनकी जांच की जानी चाहिए। में एक rather simple test case (आपका वास्तविक कोड कुछ भिन्न हो सकता है), मैं ब्राउज़रों में मिश्रित परिणाम लगता है:

enter image description here

Chrome और Firefox बहुत ज्यादा दो परीक्षणों के बीच भिन्न नहीं है, लेकिन मामूली अंतर विपरीत में है दोनों के बीच दिशानिर्देश। आईई 9 this की एक सहेजी गई प्रति का उपयोग कर परीक्षण दिखाता है जिसे मैंने self को काफी धीमा होने के लिए बुलाया।

क्रोम और फ़ायरफ़ॉक्स और आईई 9 में एक महत्वपूर्ण और लगातार प्रदर्शन अंतर के बिना this परीक्षण केस दिखाता है, मुझे लगता है कि आप निष्कर्ष निकाल सकते हैं कि आपके द्वारा पूछे जाने वाले डिज़ाइन पैटर्न ब्राउज़र में लगातार प्रदर्शन को बढ़ावा नहीं दे रहे हैं।

मेरे कोड में, मैं एक और चर केवल जब मैं इनलाइन ईवेंट हैंडलर्स, कॉलबैक या तरीकों जहां this कुछ और करने के लिए स्थापित किया गया है के अंदर मूल वस्तु के लिए एक सुसंगत संदर्भ के लिए इसकी आवश्यकता this की एक प्रतिलिपि सहेजें। दूसरे शब्दों में, जब आवश्यक हो तो मैं केवल इस डिजाइन पैटर्न को लागू करता हूं।

एक previous discussion of this design pattern here on SO में, यह निष्कर्ष निकाला गया कि कुछ पुस्तकालयों के क्रम में इस डिजाइन पैटर्न का उपयोग अतिरिक्त न्यूनतम अनुमति देने के लिए क्योंकि this है कि यह लेता है चार अक्षर नीचे न्यूनतम किया जा सकता है, लेकिन एक स्थानीय चर को यह बताए एक को न्यूनतम किया जा सकता है एकल वर्ण परिवर्तनीय नाम।

+0

ओपेरा टेस्ट केस को माइक्रो-ऑप्टिमाइज़ करने लगता है, वे बिल्कुल बराबर समय में चल रहे हैं :-) – Bergi

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