2015-01-22 12 views
5

मैं प्रत्येक लूप के लिए हमारे कुछ में सुधार करने के लिए देख रहा हूं और विभिन्न तरीकों की तुलना करने के लिए परीक्षण बेंचमार्क बनाया है। परीक्षण found here हो सकता है।जावास्क्रिप्ट फोरैच लूप प्रदर्शन

मैं इस कोड है कि पता लगाने के लिए हैरान था:

function add(val) { 
    sum += val; 
} 
values.forEach(add); 

इस एक से बेहतर प्रदर्शन करती है।

values.forEach(function(val) { 
    sum += val; 
    }); 

क्या ये बिल्कुल वही नहीं हैं? दूसरे कोड की तुलना में पहला कोड स्निपेट तेजी से क्या बनाता है?

+0

दोनों तेजी से कर रहे हैं मेरे पीसी पर .055 और .053 सेकेंड –

+1

में 56 बार ऐसा इसलिए है क्योंकि फ़ंक्शन घोषणाएं आमतौर पर फ़ंक्शन एक्सप्रेशन से अधिक तेज़ होती हैं: http://jsperf.com/function-declaration-vs-function-expression। –

+0

@AaditMShah यह काफी दिलचस्प है! – Jonathan

उत्तर

6

यह आपके परीक्षण में एक समस्या है। आपका परीक्षण कर रहे हैं:

values.forEach(add); 

और

values.forEach(function(val) { 
    sum += val; 
}); 

दूसरे टेस्ट में, आप समारोह के निर्माण के साथ-साथ forEach के निष्पादन के समय कर रहे हैं। पहले परीक्षण में, आप फ़ंक्शन के निर्माण का समय नहीं लगा रहे हैं; यह परीक्षण के सेटअप चरण के दौरान किया जाता है, जो समय नहीं है।

function add(val) { 
sum += val; 
} 
values.forEach(add); 

बनाम

values.forEach(function(val) { 
    sum += val; 
}); 

... जिसमें प्रदर्शन में अंतर कुछ पर कुछ इंजन पर गायब हो जाता है, और दूसरी तरह से चला जाता है (घोषणा धीमी जा रहा है):

Davin Tryona test that creates the functions in both cases बनाया । (उत्तरार्द्ध शायद उस इंजन परीक्षण के दौरान पता लगा लेता है कि यह समारोह इनलाइन कर सकते हैं, या कम से कम चरणों में से कुछ को छोड़ कि यह एक घोषणा के साथ नहीं जा सकते हैं है।)

enter image description here

+2

यहां परीक्षण का एक कांटा है: http://jsperf.com/for-vs-foreach/271 –

+0

फिर भी, यह ध्यान रखना अच्छा है कि आपके कार्यों को पहले से घोषित करना तेज है! – Jonathan

+0

@ जोनाथन: आपको क्या लगता है? बशर्ते आप बार-बार की बजाय फ़ंक्शंस बनाएं, घोषणा बनाम अभिव्यक्ति मॉड्यूलो इनलाइनिंग से कोई फर्क नहीं पड़ता (डेविन के अपडेट से परिणाम देखें जो मैंने उत्तर में जोड़ा है)। –

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