2012-11-21 24 views
5

ऑप्टिमाइज़ेशन पर the recent smashing magazine लेख पढ़ने के बाद, मैंने यह देखने के लिए कुछ परीक्षण चलाए कि मेरे सरणी में से एक के बीच से एक तत्व को "हटाने" का सबसे प्रभावी तरीका क्या होगा।पहले तत्व को हटाने के बाद ऐरे ट्रैवर्सल परिमाण तेजी से

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

अधिक जांच ने मुझे this पर ले जाया।

किसी कारण से, सरणी से पहले रिकॉर्ड में .shift() 'इसे 300 गुना तेज करने के लिए बनाया गया है (v8 में सबसे बड़ा प्रदर्शन देखा जा रहा है, लेकिन ऐसा लगता है कि मैंने कोशिश की सभी ब्राउज़रों के लिए मान्य है उस में)।

मुझे संदेह है कि मैं इसका दुरुपयोग करूंगा क्योंकि मुझे नहीं लगता कि वास्तविक ट्रैवर्सल एक बाधा है, लेकिन क्या कोई यह जानता है कि यह व्यवहार क्यों होता है?

संपादित करें: जेएसपीरफ़ का गलत उपयोग नीचे अंतर्निहित मुद्दा था, नीचे मेरा जवाब देखें।

उत्तर

0

ठीक है, यह पता चला है कि यह वास्तव में जेएसपीआरएफ कैसे काम करता है इसके बारे में एक गलतफहमी है।

स्क्रिप्ट का सेटअप अनुभाग ऐसा कुछ है जो हर बार लूप के सेट पर शुरू होता है, इसे हर बार स्क्रिप्ट की कोशिश करता है।

जैसा कि दिखाया गया है here संख्याएं वास्तव में बाहर निकलती हैं जैसी आप अपेक्षा करते हैं।

0

इसलिए मैंने कोर फ़ंक्शन को फॉर-लूप में तुलना करने के साथ-साथ प्रत्येक फ़ंक्शन से फॉर-लूप को हटाने का प्रयास किया।

http://jsperf.com/spliced-vs-non-spliced/3

मानक प्रत्येक कार्य के आंतरिक कामकाज में इन सरल मतभेद के कारण परिमाण स्केलिंग रहे हैं। न्यूनतम हिस्सों को सरल बनाकर, हम वास्तविक मतभेदों को अलग करने में सक्षम हैं। मुझे इस पर आधारित संदेह है कि फॉर-लूप वास्तव में किसी भी तेज या धीमी गति से चल रहा है - यह परीक्षण में अन्य कार्यों की वजह से ऐसा लगता है।

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

+0

मुझे ऐसा नहीं लगता है, अगर ऐसा होता है, तो यह परीक्षण केस http://jsperf.com/spliced-vs-non-spliced/6 दोनों एक ही गति के साथ आना चाहिए, विभाजन के साथ बहुत ही मामूली तेजी से जो मामला प्रतीत नहीं होता है। – Doug

1

प्रदर्शन परीक्षण अनगिनत त्रुटियों से भरा है।
सबसे महत्वपूर्ण बात 1000 की नमूना लंबाई लेना है। आज के प्रोसेसर के साथ, 1000 आइटम सरणी को घुमाकर तुरंत किया जाता है, और आप पहली सरणी विधि (शिफ्ट, स्लाइस, ...) द्वारा उठाए गए समय को मापते हैं। वास्तविक सरणी ट्रैवर्सल से।
तो आपको
1) बहुत अधिक सरणी का उपयोग करें,
2) स्लाइस/शिफ्ट/... लूप से पहले क्योंकि आप मापना नहीं चाहते हैं।

फिर आप देखेंगे कि कोई जादुई है, और सरणी ट्रेवर्सल सभी सरणियों के लिए एक ही समय लेता है।

मैंने सामान्य/कटा हुआ (0,0) और शिफ्ट() मामलों के लिए http://jsperf.com/spliced-vs-non-spliced/4 में शुरू किया। प्रदर्शन में अंतर त्रुटि मापने के लिए कम हैं।