2011-05-24 11 views
8

किस तरह से अधिक कुशल है? क्या कोई अंतर है?जावास्क्रिप्ट str.length प्रत्येक बार इसे कॉल या सिर्फ एक बार गणना की जाती है?

यह एक:

var str = 'abc'; 

if(str.length == 20) { 
    //... 
} 

if(str.length == 25) { 
    //... 
} 

// and so on 

या यह एक:

var str = 'abc'; 
var length = str.length; 

if(length == 20) { 
    //... 
} 

if(length == 25) { 
    //... 
} 

// and so on 

उत्तर

9

ब्राउज़रों यह वास्तव में बात (पढ़ें: आईई) हो सकता है, जहां से यह हर बार की गणना की जाएगी, तो यह स्टोर करने के लिए सबसे तेज़ है एक स्थानीय चर में मूल्य।

http://jsperf.com/string-length


यह used to be कि

var len = someArray.length; 
for (var i=0; i<len; i++) { 
    // ... 
} 

की तुलना में तेजी

for (var i=0; i<someArray.length; i++) { 
    // ... 
} 

लेकिन इन दिनों, वी 8 के (Chrome की जे एस इंजन) से अधिक तेजी से चलाने के लिए उत्तरार्द्ध का अनुकूलन था पूर्व। यह बहुत अच्छा है - बस याद रखें, आपको क्रोम में प्रदर्शन के बारे में चिंता करने की ज़रूरत नहीं है।


आप जावास्क्रिप्ट प्रदर्शन के बारे में अधिक जानने के लिए उत्सुक हैं, तो High Performance JavaScript एक ठोस पढ़ा है। नमक के अनाज के साथ अपनी सिफारिशें लें, हालांकि, आईई (6, 7, 8 या यहां तक ​​कि 9) में कोड तेजी से चलने वाली चाल से क्रोम या फ़ायरफ़ॉक्स में कोड धीमा हो सकता है।

+0

दिलचस्प है कि यह अभी भी IE9 में अभी भी थोड़ा धीमा है। हालांकि क्रोम शीर्षक के लिए था। – Matt

1

दूसरा अब तक सुरक्षित तरीका है। पहले आप मान रहे हैं कि इसे फिर से नहीं लिया जाएगा। दूसरे में आप जानते हैं कि यह नहीं होगा। दूसरा हमेशा सबसे अच्छा तरीका नहीं है। यह केवल तभी काम करेगा जब आप जानते हैं अन्य प्रक्रियाएं सरणी की लंबाई को प्रभावित नहीं करतीं। तो वैश्विक चर आदि के साथ आपको सावधान रहना होगा। यह एक लूप के अंदर एक सरणी की सामग्री (लंबाई) को संशोधित करने के लिए भी लागू हो सकता है जो सरणी के ऊपरी बाउंड पर रुक जाता है।

0

सिद्धांत रूप में, मैं उम्मीद करता हूं कि दूसरा कोड ब्लॉक तेज होना चाहिए।

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

यह मुख्य मुख्यधारा के उपयोग में आईई 8 और निचले अपवाद के स्पष्ट अपवाद के साथ बहुत सारे ब्राउज़रों पर लागू होना चाहिए, जहां यह किसी का अनुमान है कि यह कैसे करता है, लेकिन यह किसी भी तरह से धीमा हो जाएगा।

1

Strings are immutable in JavaScript, इसलिए यह संभावना नहीं है कि जावास्क्रिप्ट के खराब कार्यान्वयन भी हर बार जब आप इसे एक्सेस करते हैं तो स्ट्रिंग की लंबाई संपत्ति को पुन: प्राप्त करेंगे।

आप वास्तव में jsperf का उपयोग कर स्वयं का परीक्षण कर सकते हैं; क्रोम 12, it actually looks like your first example is faster का उपयोग कर।

+1

यह _calculating_ लंबाई की बात नहीं है - क्योंकि तार अपरिवर्तनीय हैं, उनकी लंबाई एक (स्थिर) संपत्ति है। यह बार-बार उस संपत्ति तक पहुंचने का मामला है। –

+0

@ मैट - वास्तव में, मैं सी # गुणों के संदर्भ में सोच रहा था जो जटिल गणना छुपा सकते हैं।मेरा मुद्दा मूल रूप से था क्योंकि तार अपरिवर्तनीय हैं, लंबाई एक निरंतर मान है, इसलिए ओपी के उदाहरणों के बीच महत्वपूर्ण प्रदर्शन अंतर होने की संभावना नहीं है। (और जैसा कि आपने पाया है, स्निपेट वास्तव में विभिन्न जेएस कार्यान्वयन में अलग-अलग प्रदर्शन करते हैं) – Dexter

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