2010-11-02 24 views
5

जब मैंने ग्विडो वैन रॉसम के निबंध An Optimization Anecdote पढ़ा तो यह शुरू हुआ।array.map (String.fromCharCode) इतना धीमा क्यों है?

numbers.map(function(x){ return String.fromCharCode(x); }); 

यह बहुत तेजी से पहले से ही था, लेकिन क्यों गुमनाम समारोह पूरी तरह से खत्म करने और मैप करने के लिए सीधे String.fromCharCode पारित() नहीं:

जावास्क्रिप्ट में एक ही बात की कोशिश करने का निर्णय, मैं निम्नलिखित समय समाप्त हो गया:

numbers.map(String.fromCharCode); 

मैं इसे समय समाप्त हो गया और ... ... यह था ~ 100 गुना धीमी पिछले संस्करण से। कैसे?

किसी भी तरह से इस मूल कार्य को सीधे Array.map() पर पास करने से यह किसी अन्य फ़ंक्शन के अंदर लपेटने और Array.map() को पास करने से धीमा है।

  • यह ब्राउज़र विशिष्ट नहीं है: क्रोम, फ़ायरफ़ॉक्स और ओपेरा में परीक्षण किया गया है।

  • यह नक्शा() के लिए विशिष्ट नहीं है(): प्रयास किया गया है(), जो समान व्यवहार करता है।

  • यह अंतर्निहित कार्यों के लिए विशिष्ट नहीं है: मैथ.राउंड() और Math.sin() की कोशिश की - इन परिणामों के साथ ही उम्मीद की जाएगी: Array.map() को फ़ंक्शन पास करना थोड़ा सा था इंटरमीडिएट अज्ञात फ़ंक्शन का उपयोग करने से थोड़ा तेज़।

ऐसा लगता है कि समस्या विशेष रूप से String.fromCharCode के साथ है।

यहां क्या हो रहा है?

पी एस। मूल रूप से इस प्रश्न को Hacker News thread में देखा गया, लेकिन चूंकि संबंधित आलेख पाइथन के बारे में है, मैंने सोचा कि इसे यहां पोस्ट करते समय जावास्क्रिप्ट देवताओं के लिए अधिक जोखिम मिलेगा। क्रॉस-पोस्टिंग के लिए खेद है।

उत्तर

5

अपने आप से समाधान मिला।

समस्या यह है कि String.fromCharCode() कई तर्क लेता है और Array.map() कॉलबैक में कई तर्क भी पास करता है। इसलिए कोड:

numbers.map(function(x, y, z){ return String.fromCharCode(x, y, z); }); 

जहां से यह काफी स्पष्ट है क्यों यह इतनी धीमी गति से है:

numbers.map(String.fromCharCode); 

वास्तव में के बराबर है। इसके अतिरिक्त यह भी छोटी गाड़ी है।

+1

मैं बस यही जवाब पोस्ट करने वाला था। अपेक्षित परिणाम अलग है क्योंकि 'String.fromCharCode' पारित सभी तर्कों से लौटाई गई स्ट्रिंग का निर्माण करता है (इस मामले में, पहले 2 तर्क पारित किए गए क्योंकि तीसरा संख्या नहीं है)। –

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