2011-12-06 6 views
5

मैं स्ट्रिंग से हस्ताक्षरित 16 बिट मान निकालने के लिए कुछ कोड का उपयोग कर रहा हूं।जावास्क्रिप्ट - स्ट्रिंग.प्रोटोटाइप में जोड़े गए कार्यों के V8 में खराब प्रदर्शन?

मुझे पता चला कि String के लिए प्रोटोटाइप को यह समारोह जोड़ने:

var UInt16 = function(s, n) { 
    return s.charCodeAt(n) + 256 * s.charCodeAt(n + 1); 
}; 

Firefox में अंतर:

String.prototype.UInt16 = function(n) { 
    return this.charCodeAt(n) + 256 * this.charCodeAt(n + 1); 
}; 

सिर्फ एक समारोह जो एक पैरामीटर के रूप में एक String लेता है की तुलना में बहुत धीमी है केवल दो का कारक है, लेकिन क्रोम 15 में यह एक सौ बार धीमा है!

देखें http://jsperf.com/string-to-uint16

में परिणाम किसी को भी इस के लिए एक स्पष्टीकरण proffer कर सकते हैं, और/या प्रदर्शन हिट के बिना प्रोटोटाइप का उपयोग करने का एक वैकल्पिक तरीका प्रदान करते हैं?

+3

http://groups.google.com/group/nodejs/browse_thread/thread/45d6dc32250c0ad3 कुछ प्रकाश डाल सकता है। यह थोड़ा निराशाजनक है। –

+0

@ क्रिसेंटफ्रेश, मेरा जवाब देखें, यह अभी भी बहुत धीमा है और ऑब्जेक्ट्स का उपयोग करते समय थ्रेड में दावा के रूप में "1% के भीतर" नहीं है ... या शायद मैं इसे गलत कर रहा हूं? – Esailija

+0

@Esailija: मुझे प्रश्न के आपके उत्तर का संबंध नहीं दिख रहा है। परीक्षण मामलों में आपके जोड़ों को बस दिखाया जाता है (जैसे कि Google समूह चर्चा कवर) जो 'स्ट्रिंग' ऑब्जेक्ट के संदर्भ को सहेजते हैं, उस ऑब्जेक्ट पर प्रोटोटाइप विधियों को एक आदिम पर कॉल करने के बजाय तेज़ परिणाम उत्पन्न करते हैं। ओपी को संबोधित करने की कोशिश की जा रही मौलिक समस्या को ऑब्जेक्टिव टाइप जबरन के साथ करना पड़ता है जब मुक्केबाजी एक वस्तु के लिए बार-बार होता है। –

उत्तर

1

एक आदिम से प्रोटोटाइप तक पहुंच (क्योंकि यह कोई वस्तु नहीं है) किसी ऑब्जेक्ट से प्रोटोटाइप तक पहुंचने से बहुत धीमी है।

http://jsperf.com/string-to-uint16/2

10x तेजी से क्रोम और 2x तेजी से फ़ायरफ़ॉक्स में मेरे लिए में।

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

0

एल्निटैक, मैं एक त्वरित jsperf test (जो मैंने गलती से प्रकाशित) बनाया है, और यह पता चलता है कि उपयोगकर्ता प्रकार के प्रोटोटाइप धीमी नहीं हैं। जब V8 काम करता है इंजन पर विचार करते समय, यह समझ में आता है कि अंतर्निहित वस्तुओं में कोड जोड़ते समय जावा संकलन बहुत अलग व्यवहार करेगा।

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