2011-07-01 18 views
19

मैं कुछ कोड लागू कर रहा हूं जो मानचित्र के लिए एक प्राकृतिक फिट है। हालांकि, मैं एक सूची में वस्तुओं है कि मैं के माध्यम से पुनरावृति करने जा रहा हूँ की एक बड़ी मात्रा है, तो मेरे सवाल का जो इस abou जाना सबसे अच्छा तरीका है:JQuery मानचित्र बनाम जावास्क्रिप्ट मानचित्र बनाम फॉर-लूप

var stuff = $.map(listOfMyObjects, someFunction()) 

var stuff = listOfMyObjects.map(someFunction()) 

या सिर्फ

var stuff = new Array(); 
for(var i = 0; i < listOfmyObjects.length; i++){ 
    stuff.push(someFunction(listOfMyObjects[i])); 
} 
+0

आपके उदाहरण समकक्ष नहीं हैं (न ही पहला कोड स्निपेट भावना बनाता है)। क्या आप सूची में प्रत्येक तत्व के लिए 'कुछ फ़ंक्शन' निष्पादित करने का मतलब रखते हैं? क्या यह एक मूल्य वापस करता है और आप वापसी मूल्य के साथ सूची प्रविष्टि को प्रतिस्थापित करना चाहते हैं? यह वास्तव में 'मानचित्र' का विचार है। –

उत्तर

11

उत्तरार्द्ध (लूप के लिए) बहुत तेज़ है। मुझे कहीं बेंचमार्क देखना याद है लेकिन मुझे लिंक नहीं मिल रहा है।

यदि प्रदर्शन वास्तव में एक मुद्दा है तो मैं लूप का उपयोग करूंगा। यह वास्तव में कोड को अस्पष्ट नहीं करता है।

+8

फॉर लूप शायद उसी प्रदर्शन के करीब-करीब होगा जब तक कि वह लूप को कुछ फ़ंक्शन को रेखांकित नहीं करता। नक्शा अनिवार्य रूप से केवल एक ही काम करने के साथ एक ही काम कर रहा है, लेकिन प्रदर्शन हिट हर बार फ़ंक्शन को कॉल करने से आता है, जो प्रत्येक फ़ंक्शन के दायरे को पॉप्युलेट करता है। – Robert

+1

https://jsperf.com/map-vs-for-loop-performance/6 – ericn

6

सबसे पहले, सच Objects मूल .map() विधि नहीं है, न तो .length संपत्ति। तो हम या तो Arrays या Array-like-objects (उदाहरण के लिए jQuery ऑब्जेक्ट्स) के बारे में बात कर रहे हैं।

हालांकि, मूल for, while या do-while लूप का उपयोग करने के बजाय पुनरावृत्ति करने का कोई तेज़ तरीका नहीं है। अन्य सभी कार्यात्मक संचालन प्रदर्शन करते हैं (अनुमान लगाते हैं) प्रत्येक पुनरावृत्ति के लिए एक समारोह जो लागत।

jQuery के .each() किसी ऑब्जेक्ट को पास होने पर for-in लूप निष्पादित करेगा। यह वस्तु पर लूप करने का सबसे तेज़ तरीका है। आप बस for-in स्वयं का उपयोग कर सकते हैं और आप ओवरहेड कॉल को सहेज सकते हैं।

रीडबिलिटी के मामले में एक और "अच्छा" तरीका ईएस 5 सुविधाओं जैसे .keys() और .map() का उपयोग करना है। उदाहरण के लिए:

var myObj = { 
    foo: 'bar', 
    base: 'ball', 
    answer: 42, 
    illuminati: 23 
}; 

Object.keys(myObj).map(function(prop) { 
    console.log(myObj[ prop ]); 
}); 

कौन सा मुझे लगता है कि readabilty, convinience और प्रदर्शन के मामले में एक बहुत अच्छा tradeof है। बेशक आपको पुराने ब्राउज़र के लिए ईएस 5 एब्स्ट्रक्शन लाइब्रेरी का उपयोग करना चाहिए।

लेकिन फिर, प्रदर्शन के संदर्भ में देशी लूप को हरा करने का कोई तरीका नहीं है।

+0

क्षमा करें, मैंने गलत बात की थी। मैं एक सूची में वस्तुओं कहना था। अधिक समझने के लिए मेरे प्रश्न को संपादित किया। – dave

1

jsperf पर अपने एचटीएमएल/जावास्क्रिप्ट कोड के साथ एक परीक्षण केस बनाएं।

आप यह देखने में सक्षम होंगे कि सबसे अच्छा क्या काम करता है, और कितने तेज़ ब्राउज़र लूप प्रदर्शन करते हैं।

मैं अपना पैसा देशी जावास्क्रिप्ट लूप पर रखूंगा, लेकिन आप कभी नहीं जानते।

2

+1 "परीक्षण" के लिए +1 "एमिल द्वारा जवाब :) यह हमेशा सही जवाब है।

लेकिन हाँ, मूल लूप जीतते हैं, और आप लंबाई को कैश करके एक बेहतर कर सकते हैं ताकि लम्बाई संदर्भ प्रत्येक पुनरावृत्ति का मूल्यांकन नहीं किया जा सके।

for(var i = 0, l = list.length; i < l; i++) 

या पीछे की ओर

for(var i = list.length-1; i >= 0; i--) 

यह कार्य करके अतिरिक्त वर से बचने और, यदि आप 'इनलाइन' 'someFunction', कि तेजी से अभी भी हो जाएगा कर सकते हैं। असल में, जितना संभव हो उतना फ़ंक्शन कॉल और संदर्भ से बचें। लेकिन यह केवल तभी है जब आप वास्तव में अच्छी जानकारी देख रहे हों। इस तरह की संभावनाओं के अनुकूल होने की संभावना बहुत अधिक है। हमेशा अपनी बाधाओं को खोजने के लिए परीक्षण करें।http://jsben.ch/#/BQhED

यह पता चलता है कि एक के लिए लूप नक्शा एक jQuery नक्शा (कम से कम क्रोम में) की तुलना में तेजी है:

+3

'के लिए (var i = array.length; i -;) 'रिवर्स-लूपिंग के लिए एक बेहतर विकल्प है। – sabithpocker

11

यहाँ एक परीक्षण jsben.ch में किया मामला है।

+1

मैंने प्रश्न में वर्णित तीसरा मामला भी जोड़ा, लेकिन लूप दृष्टिकोण की आपकी सिफारिश अभी भी मेरे लिए पहले (क्रोम) है। –

+0

यह देखना दिलचस्प होगा कि d3.js और underscore.js मानचित्र विधियों की तुलना इनकी तुलना करें। – amergin

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