दिलचस्प पोस्ट
PHP एसपीएल रिकर्सिव डायरेक्टरीआइटरेटर रिकर्सिवइटरेटरइटरेटर पूर्ण पेड़ को पुनः प्राप्त कर रहा है बूटस्ट्रैप मोडल में एक विशेष फ़ील्ड के लिए फोकस कैसे सेट करें, इसे दिखाई देने के बाद c # डेटाटेबल से सीएसवी जांचते हुए कि कोई चर एक पूर्णांक है या नहीं गैलरी से एक छवि कैसे चुनें (एसडी कार्ड) मेरे ऐप के लिए? php: json सरणी के माध्यम से लूप SQLite दिनांकटाइम तुलना क्या आप बिना किसी उपयोगकर्ता को अनुमति देने के लिए ग्राफ़ एपी का उपयोग कर एक सार्वजनिक फेसबुक पेज की फीड प्राप्त कर सकते हैं? # कोष्ठक कोष्ठक का उपयोग करके इंपोर्ट <> और उद्धरण अंक "" इकाई ढांचे कोड पहले समर्थन संग्रहीत प्रक्रियाओं है? एचटीटीपीएस के साथ, यूआरएल और अनुरोध बॉडी के रूप में संरक्षित अनुरोध हैडर हैं? Windows में एक फ़ाइल का एन्कोडिंग प्राप्त करें imageView के लिए यूआरएल से छवि कैसे सेट करें क्या HTML5 दिनांक पिकर के लिए कोई भी स्टाइल विकल्प हैं? एंड्रॉइड और स्ट्रिंग के रूप में आईडी डास्ट के साथ एक दृश्य प्राप्त करना

बाँध क्यों एक बंद से धीमी है?

पिछले पोस्टर ने फ़ंक्शन को बताया। बिन्दु बनाम क्लोजर इन जावास्क्रिप्ट: कैसे चुनें?

और इस उत्तर को इस भाग में प्राप्त किया गया, जो लगता है कि बाँध बंद होने से तेज़ होना चाहिए:

स्कोप ट्रवर्सल का मतलब है, जब आप किसी मूल्य (चर, ऑब्जेक्ट) को पकड़ने के लिए पहुंच रहे हैं, जो एक अलग क्षेत्र में मौजूद है, इसलिए अतिरिक्त ओवरहेड जोड़ा जाता है (कोड निष्पादित करने के लिए धीमी हो जाता है)।

बाँध का उपयोग करते हुए, आप एक मौजूदा क्षेत्र के साथ एक फ़ंक्शन बुला रहे हैं, जिससे कि गुंजाइश चलती नहीं होती।

दो jsperfs का सुझाव है कि बाइंड वास्तव में अधिक है, एक बंद होने से बहुत धीमी है

यह ऊपर टिप्पणी करने के लिए पोस्ट किया गया था

और, मैंने अपना खुद का जेस्परफ़ लिखने का फैसला किया

तो क्यों बाध्य इतना धीमा है (70% क्रोमियम पर)?

चूंकि यह तेज़ नहीं है और क्लोजर एक ही उद्देश्य की सेवा कर सकते हैं, क्या बद्ध होना चाहिए?

वेब के समाधान से एकत्रित समाधान "बाँध क्यों एक बंद से धीमी है?"

क्रोम 59 अपडेट: जैसा कि मैंने नीचे दिए गए उत्तर में भविष्यवाणी की थी, वह अब नए अनुकूलन संकलक के साथ धीमी नहीं है। विवरण के साथ कोड यहां है: https://codereview.chromium.org/2916063002/

ज्यादातर समय यह कोई फर्क नहीं पड़ता

जब तक आप एक आवेदन नहीं बना रहे हैं जहां। बाधा है बाधा मैं परेशान नहीं होता। अधिकांश मामलों में सरासर प्रदर्शन से पठनीयता अधिक महत्वपूर्ण है मुझे लगता है कि देशी का उपयोग करना .bind आम तौर पर अधिक पठनीय और रखरखाव वाले कोड प्रदान करता है – जो कि एक बड़ा प्लस है

हालांकि हाँ, जब यह मायने रखता है -। .bind धीमा है

हाँ, .bind बंद होने से काफी धीमी है – कम से कम क्रोम में, कम से कम वर्तमान में इसे v8 में लागू किया गया है। मुझे व्यक्तिगत रूप से नोड में स्विच करना पड़ता है। जेएसएस प्रदर्शन के लिए कुछ समय (अधिक सामान्यतः, क्लोजर धीमे प्रदर्शन की गहन स्थिति में हैं)

क्यूं कर? चूंकि .bind एल्गोरिथ्म किसी अन्य फ़ंक्शन के साथ फ़ंक्शन लपेटने और .apply या .apply का उपयोग करने से बहुत अधिक जटिल है। (मजेदार तथ्य, यह इसके साथ एक समारोह को स्ट्रिंग सेट [मूल फ़ंक्शन] पर देता है)।

इस पर विचार करने के विनिर्देश बिंदु से और देखने के क्रियान्वयन के बिंदु से, इस पर दो तरीके देख सकते हैं। चलो दोनों को देखें।

सबसे पहले, आइए विनिर्देश में परिभाषित बाइंड एल्गोरिथ्म को देखें :

  1. लक्ष्य को यह मान दें।
  2. अगर IsCallable (Target) झूठी है, तो TypeError अपवाद डालें।
  3. इस एआरजी (arg1, arg2 आदि) के बाद दिए गए सभी तर्क मानों की एक नई (संभवतः रिक्त) आंतरिक सूची होनी चाहिए, क्रम में।

([21], [[परिभाषित]]: फेंकने वाला, [[संख्यात्मक]]: झूठा, [[कॉन्फ़िगर करने योग्य]]: [[परिभाषित]] ]: झूठी}, और झूठी।

(22. वापसी एफ।

बहुत जटिल लगता है, सिर्फ एक रैप से बहुत अधिक है

दूसरा, चलो देखते हैं कि क्रोम में यह कैसे लागू किया गया है ।

चलो v8 (क्रोम जावास्क्रिप्ट इंजन) स्रोत कोड में फंक्शनबैंड को चेक करें:

 function FunctionBind(this_arg) { // Length is 1. if (!IS_SPEC_FUNCTION(this)) { throw new $TypeError('Bind must be called on a function'); } var boundFunction = function () { // Poison .arguments and .caller, but is otherwise not detectable. "use strict"; // This function must not use any object literals (Object, Array, RegExp), // since the literals-array is being used to store the bound data. if (%_IsConstructCall()) { return %NewObjectFromBound(boundFunction); } var bindings = %BoundFunctionGetBindings(boundFunction); var argc = %_ArgumentsLength(); if (argc == 0) { return %Apply(bindings[0], bindings[1], bindings, 2, bindings.length - 2); } if (bindings.length === 2) { return %Apply(bindings[0], bindings[1], arguments, 0, argc); } var bound_argc = bindings.length - 2; var argv = new InternalArray(bound_argc + argc); for (var i = 0; i < bound_argc; i++) { argv[i] = bindings[i + 2]; } for (var j = 0; j < argc; j++) { argv[i++] = %_Arguments(j); } return %Apply(bindings[0], bindings[1], argv, 0, bound_argc + argc); }; %FunctionRemovePrototype(boundFunction); var new_length = 0; if (%_ClassOf(this) == "Function") { // Function or FunctionProxy. var old_length = this.length; // FunctionProxies might provide a non-UInt32 value. If so, ignore it. if ((typeof old_length === "number") && ((old_length >>> 0) === old_length)) { var argc = %_ArgumentsLength(); if (argc > 0) argc--; // Don't count the thisArg as parameter. new_length = old_length - argc; if (new_length < 0) new_length = 0; } } // This runtime function finds any remaining arguments on the stack, // so we don't pass the arguments object. var result = %FunctionBindArguments(boundFunction, this, this_arg, new_length); // We already have caller and arguments properties on functions, // which are non-configurable. It therefore makes no sence to // try to redefine these as defined by the spec. The spec says // that bind should make these throw a TypeError if get or set // is called and make them non-enumerable and non-configurable. // To be consistent with our normal functions we leave this as it is. // TODO(lrn): Do set these to be thrower. return result; 

हम कार्यान्वयन में यहां महंगे चीजों का एक गुच्छा देख सकते हैं। अर्थात् %_IsConstructCall() यह निश्चित रूप से विनिर्देशन के पालन के लिए आवश्यक है – लेकिन यह कई मामलों में सरल लपेटो की तुलना में धीमी बनाता है


एक और नोट पर, कॉलिंग .bind भी थोड़ा अलग है, स्पेक नोट्स "फ़ंक्शन.प्रोटोटाइप.बिंड का उपयोग करके बनाई गई फंक्शन ऑब्जेक्टों में प्रोटोटाइप संपत्ति या [[कोड]], [[औपचारिक पैरामीटर]] और [[स्कोप] नहीं है ] आंतरिक गुण "