2010-11-19 15 views
25

यही है, क्या मैं अलग-अलग सरणी सम्मिलनों के लिए इस फ़ंक्शन को कॉल करने की आवश्यकता होने पर किसी प्रकार के पेड़ या सूची डेटा संरचना को छोड़ने के लिए बेहतर अनुकूल होगा?जावास्क्रिप्ट: 'splice' का एल्गोरिदमिक प्रदर्शन क्या है?

+0

यह टेस्ट! इस सवाल का जवाब देने का यह सबसे अच्छा तरीका है ... – Harmen

+0

इसका परीक्षण करने का एक अच्छा तरीका क्या है? – Hamster

+0

यदि जावास्क्रिप्ट के सरणी वास्तव में सरणी हैं, तो यह ओ (एन) है। – Gumbo

उत्तर

15

आप इस बात पर विचार कर सकते हैं कि आप इसके बजाय सीधे मानचित्र का उपयोग करना चाहते हैं; सभी जावास्क्रिप्ट ऑब्जेक्ट्स (Array उदाहरणों सहित) मानचित्र हैं, और इसलिए एक कार्यान्वयन (नोट मैं नहीं कहता "करता है") उचित प्रदर्शन हैशिंग एल्गोरिदम है।

इसके अलावा, splice का प्रदर्शन कार्यान्वयन (उदाहरण के लिए, विक्रेताओं) के बीच लॉट भिन्न होने जा रहा है। यह एक कारण है कि "समय-समय पर अनुकूलन न करें" जावास्क्रिप्ट अनुप्रयोगों के लिए और भी उचित सलाह है जो सामान्य विक्रेता के लिए भी कई विक्रेता कार्यान्वयन (उदाहरण के लिए वेब ऐप्स) में चलती है। अपने कोड को अच्छी तरह से मॉड्यूलरकृत रखें और यदि प्रदर्शन होता है तो प्रदर्शन के मुद्दों को हल करें।

+1

मानचित्र के साथ समस्या यह नहीं है कि मुझे लगता है कि मैं क्रमबद्ध क्रम में इसे पुन: सक्रिय कर सकता हूं ... – Hamster

+1

@Hamster: आप केवल सभी चाबियाँ ढूंढकर, उन्हें सॉर्ट करके, और फिर उस सूची के माध्यम से लूपिंग कर सकते हैं। यदि आपको इसे बहुत कुछ करना है, तो आप शायद 'ऐरे' (जो जावास्क्रिप्ट में है, केवल एक निर्धारित क्रम के साथ एक नक्शा और एक जादू 'लंबाई' संपत्ति के साथ बेहतर है)। –

+0

@ टीजे।पाउडर क्या होगा यदि मुझे पहले से मौजूद तत्वों (यानी उन्हें रखने और इंडेक्स को पुन: व्यवस्थित करने) के बीच एक विशिष्ट अनुक्रमणिका में एक तत्व डालना है, और हजारों तत्व हैं? मुझे पता है कि मैं इसे 'स्प्लिसे' के साथ कर सकता हूं, लेकिन इस तरह के कार्य के लिए 'स्प्लिस' के साथ एक उचित डेटा संरचना वाला 'ऐरे' है? यदि नहीं, तो इसके लिए कौन सी जेएस डेटा संरचना उपयुक्त हो सकती है? – tonix

7

यहाँ अंगूठे का एक अच्छा शासन, क्रोम, सफारी और फ़ायरफ़ॉक्स में किया परीक्षणों के आधार पर दिया गया है: एक सरणी के बीच में एक भी मूल्य स्प्लिसिंग मोटे तौर पर के रूप में आधा धक्का/के एक छोर को एक मूल्य के स्थानांतरण के रूप में तेजी से होता है सरणी। (नोट: केवल आकार 10,000 की एक सरणी पर परीक्षण किया गया।)

http://jsperf.com/splicing-a-single-value

बहुत तेजी से है यही कारण है कि। इसलिए, यह संभावना नहीं है कि आपको अधिक प्रदर्शन निचोड़ने के लिए एक और डेटा संरचना को लागू करने के लिए अब तक जाने की आवश्यकता है।

अद्यतन: EBusiness नीचे टिप्पणी में बताते हैं के रूप में, परीक्षण प्रत्येक splice, push के साथ एक महंगी प्रतिलिपि कार्रवाई निष्पादित करता है, और shift, जिसका अर्थ है कि यह प्रदर्शन में अंतर understates। यहाँ एक संशोधित परीक्षण है कि सरणी नकल से बचा जाता है, इसलिए यह अधिक सटीक होना चाहिए: http://jsperf.com/splicing-a-single-value/19

+1

असल में, यह पूरी तरह से सरणी की लंबाई पर निर्भर है। यदि आप 100,000 तत्व सरणी में बदलते हैं, तो अंत में एक मान को विभाजित करना अंत में एक मान जोड़ने से 95% धीमा है, जैसा कि आपके जेएसपीआरएफ परीक्षण द्वारा मापा जाता है। ऐसा इसलिए है क्योंकि मध्य में डालना ओ (एन) सरणी के आकार में है, जबकि अंत में डालने से ओ (1) हो सकता है। – Geoff

+3

-1 कि जेएसपीआरएफ परीक्षण एक सरणी की प्रतिलिपि बनाकर प्रदूषित हो जाता है, यह ज्यादातर एक नई नई 10000 आइटम सरणी बनाने के लिए लगने वाले समय को मापता है। – aaaaaaaaaaaa

+0

@e बिजनेस कृपया अपने दावे पर विस्तृत करें। परीक्षण में जहां सरणी की प्रतिलिपि बनाई जाती है? –

-1

ले जाएँ एकल मान

// \t tmp = arr[1][i]; 
 
// \t arr[1].splice(i, 1); \t // splice is slow in FF 
 
// \t arr[1].splice(end0_1, 0, tmp); 
 

 
\t tmp = arr[1][i]; 
 
\t ii = i; 
 
\t while (ii<end0_1) 
 
\t \t { 
 
\t \t arr[1][ii] = arr[1][++ii]; 
 
cycles++; 
 
\t \t } 
 
\t arr[1][end0_1] = tmp;