2014 While
वापस आ गया है
बस तार्किक सोचो।
इसे देखो
for( var index = 0 , length = array.length ; index < length ; index++ ) {
//do stuff
}
- कम से कम 2 चर (इंडेक्स, लंबाई) बनाने की आवश्यकता
- यह जाँचने की आवश्यकता है कि क्या सूचकांक लंबाई से छोटा है
- सूचकांक बढ़ाने की जरूरत है
for
पाश 3 पैरामीटर
अब मुझे बताइए कि इससे अधिक तेज़ क्यों होना चाहिए:
var length = array.length;
while( --length ) { //or length--
//do stuff
}
- एक चर
- कोई जांच नहीं
- सूचकांक कम हो गया है (मशीनें पसंद करती हैं)
while
केवल एक पैरामीटर है
मैं पूरी तरह से भ्रमित था जब क्रोम 28 ने दिखाया कि लूप थोड़ी देर के लिए तेज है। यह किसी प्रकार का होना चाहिए
"उह, हर कोई लूप के लिए उपयोग कर रहा है, चलो उस पर ध्यान केंद्रित करें जब क्रोम के लिए विकसित हो।"
लेकिन अब, 2014 में जबकि लूप क्रोम पर वापस आ गया है। यह 2 गुना तेज है, अन्य / पुराने ब्राउज़रों पर यह हमेशा तेज था।
हाल ही में मैंने कुछ नए परीक्षण किए। अब वास्तविक दुनिया में उन छोटे कोडों की कीमत कुछ भी नहीं है और jsperf वास्तव में लूप को ठीक से निष्पादित नहीं कर सकते, क्योंकि इसमें array.length को फिर से बनाने की जरूरत होती है जिसमें समय भी लगता है।
आप jsperf पर थोड़ी देर के लूप की वास्तविक गति प्राप्त नहीं कर सकते।
आपको अपना स्वयं का कस्टम फ़ंक्शन बनाने और उसके साथ जांच करने की आवश्यकता है window.performance.now()
और हाँ ... कोई उपाय नहीं है जबकि लूप बस तेज है।
वास्तविक समस्या वास्तव में डोम हेरफेर / प्रतिपादन समय / ड्राइंग समय है या फिर भी आप इसे कॉल करना चाहते हैं।
उदाहरण के लिए मेरे पास एक कैनवास दृश्य है जहां मुझे निर्देशांक और टकरावों की गणना करने की आवश्यकता है ... यह 10-200 माइक्रोसेकंड (मिलीसेकंड नहीं) के बीच किया जाता है। यह वास्तव में सब कुछ प्रदान करने के लिए विभिन्न मिलीसेकंड लेता है। जैसा कि डोम में है।
परंतु
loop
कुछ मामलों में उपयोग करने के लिए एक और सुपर परफ़ॉर्मर तरीका है ... उदाहरण के लिए किसी सरणी को कॉपी / क्लोन करने के लिए
for(
var i = array.length ;
i > 0 ;
arrayCopy[ --i ] = array[ i ] // doing stuff
);
मापदंडों के सेटअप पर ध्यान दें:
- उसी समय में जैसे कि मैं केवल एक चर का उपयोग कर रहा हूं
- यह जांचने की आवश्यकता है कि क्या सूचकांक 0 से बड़ा है;
- जैसा कि आप देख सकते हैं कि यह लूप हर किसी के उपयोग के लिए सामान्य बनाम अलग है, जैसा कि मैं 3 वें पैरामीटर के अंदर सामान करता हूं और मैं सीधे सरणी के अंदर भी घटता हूं।
कहा कि, यह पुष्टि करता है कि मशीनों की तरह -
यह लिखना कि मैं इसे थोड़ा छोटा बनाने और कुछ बेकार सामान निकालने के बारे में सोच रहा था और यह लिखा कि इसी शैली का उपयोग करके:
for(
var i = array.length ;
i-- ;
arrayCopy[ i ] = array[ i ] // doing stuff
);
यहां तक कि अगर यह छोटा है तो ऐसा लगता है कि i
एक बार और उपयोग करने से सब कुछ धीमा हो जाता है। यह पिछले for
लूप और while
एक की तुलना में 1/5 धीमा है ।
नोट:;
बिना looo के लिए के बाद बहुत महत्वपूर्ण है{}
यहां तक कि अगर मैंने अभी आपको बताया है कि स्क्रिप्ट्स का परीक्षण करने के लिए jsperf सबसे अच्छा तरीका नहीं है .. तो मैंने इस 2 छोरों को यहां जोड़ा
http://jsperf.com/caching-array-length/40
और यहां जावास्क्रिप्ट में प्रदर्शन के बारे में एक और जवाब है
https://stackoverflow.com/a/21353032/2450730
यह उत्तर जावास्क्रिप्ट लिखने के प्रदर्शन के तरीके को दिखाना है। इसलिए यदि आप पढ़ नहीं सकते हैं, तो पूछें और आपको एक उत्तर मिलेगा या जावास्क्रिप्ट http://www.ecma-international.org/ecma-262/5.1/ के बारे में एक पुस्तक पढ़ें ।