2012-03-02 10 views
6

मैंने jsperf.com के साथ खेला है और पाया है कि प्रोटोटाइप फ़ंक्शन 40x धीमी "डिफ़ॉल्ट" घोषित फ़ंक्शन से अधिक है।प्रोटोटाइप डिफ़ॉल्ट घोषित फ़ंक्शन की तुलना में 40x धीमा क्यों है?

String.prototype.contains = function(s){ return !!~this.indexOf(s) } = 220K ऑप्स/एस

बनाम

function isContains(str, s) { return !!~str.indexOf(s) } = 8.5KK ऑप्स/एस

Here's a jsperf test case

पी.एस. मुझे पता है कि प्रोटोटाइप संशोधन सबसे अच्छा मामला नहीं है और इसे 'बंदर पैचिंग' नाम दिया जा सकता है :)

+0

इस चेक बाहर है, यह स्ट्रिंग और संख्या शाब्दिक नहीं बल्कि सरणी शाब्दिक को प्रभावित करता है - http://jsperf.com/shoop-da-whoop –

+0

केवल ज्ञात वर्गों में प्रोटोटाइप जोड़ते समय। http://stackoverflow.com/questions/32847086/javascript-performance-of-extending-string-prototype-is-abysmal-vs-static-funct – Omeriko

उत्तर

6

मुझे लगता है कि यह धीमी है क्योंकि स्ट्रिंग आदिम स्वचालित रूप से एक अस्थायी वस्तु हर बार एक विधि कहा जाता है के साथ लिपटे है।

यह के प्रदर्शन को बढ़ावा देता है "hi".foo() से अधिक।

MDN docs से:

स्ट्रिंग शाब्दिक (डबल या एकल उद्धरण से चिह्नित) और तार स्ट्रिंग से लौटे (है, यानी नए कीवर्ड का उपयोग किए बिना) एक गैर निर्माता संदर्भ में कॉल आदिम तार कर रहे हैं। जावास्क्रिप्ट स्वचालित रूप से primitives और स्ट्रिंग ऑब्जेक्ट्स को परिवर्तित करता है, ताकि प्राचीन तारों के लिए स्ट्रिंग ऑब्जेक्ट विधियों का उपयोग करना संभव हो। संदर्भों में जहां एक प्राचीन स्ट्रिंग या प्रॉपर्टी लुकअप पर एक विधि लागू की जाती है, जावास्क्रिप्ट स्वचालित रूप से स्ट्रिंग आदिम को लपेट लेगा और विधि को कॉल करेगा या प्रॉपर्टी लुकअप करेगा।

आस-पास के

:

Why can't I add properties to a string object in javascript?

String object versus literal - modifying the prototype?

+0

ऑफ-विषय के लिए खेद है! लेकिन, आपने ['decl'] (http://gitbuh.github.com/decl/) नामक एक चीज़ बनाई जिसे मुझे पसंद आया, और जब मैं इसके साथ खेल रहा था, मैंने देखा कि यह IE8 पर नहीं चल रहा है (या तो, या 'घृणित' दोहन (ठंडा नाम!) काम नहीं करता है, [पृष्ठ] (http://gitbuh.github.com/decl/site/test.html) IE8 पर अजीब दिखता है)। तो हाँ, मैंने चैट रूम बनाया है यदि आपके पास कुछ क्षण हो सकते हैं कि मुझे यह बताने के लिए कि क्या कारण हो सकता है (मैं इसे चारों ओर हैक करने के लिए तैयार हूं), और इस टिप्पणी क्षेत्र को प्रदूषित नहीं कर सकता। [यहां] (http://chat.stackoverflow.com/rooms/17017/room-for-camilo-martin-and-ggg)। और कुडोस :) –

1

बाधाएं बहुत अच्छी हैं कि आप सी/मशीन कोड में लागू एक आदिम फ़ंक्शन को बंदर में जावास्क्रिप्ट बॉडी के साथ बदल रहे हैं -छित संस्करण।

+1

मुझे आपका मतलब नहीं मिलता है। '" ".contains' मौजूद नहीं है ... आपको लगता है कि वह कौन सा मूल कार्य करता है वह छाया कर रहा है? –

+0

मेरा अनुमान है कि प्रोटोटाइप प्रेषण indexOf() के कुछ कुशल संस्करण प्राप्त करने के कार्यान्वयन की क्षमता को विफल कर रहा है। जादू में 40x अंतर है - यह संकलन बनाम संकलित कोड की गंध है। –

+0

आप सीएमएस के संशोधन 4 और पर्फ के मेरे संशोधन 5 की व्याख्या कैसे करेंगे? मैं पूरी तरह से यहाँ एक नुकसान में हूँ। –

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