जब मैंने अन्य उत्तरों में समाधानों को देखा तो मैंने कुछ ऐसी चीजें देखीं जिन्हें मैं जानता हूं कि वे प्रदर्शन के लिए खराब हैं। मैं उन्हें एक टिप्पणी में डालने जा रहा था, लेकिन मुझे लगा कि इसे बेंचमार्क करना और परिणाम साझा करना बेहतर है। आप स्वयं इसका परीक्षण कर सकते हैं । नीचे मेरे परिणाम (ymmv) प्रत्येक ब्राउज़र में सबसे तेज़ संचालन के बाद सामान्यीकृत किए गए हैं (एमएस में निरपेक्ष समय प्राप्त करने के लिए सामान्यीकृत मान के साथ 1.0 बार गुणा करें)।
क्रोम फ़ायरफ़ॉक्स ओपेरा MSIE सफारी नोड
-------------------------------------------------- -----------------
1.0 समय 37ms 73ms 68ms 184ms 73ms 21ms
if-तत्काल 1.0 1.0 1.0 2.6 1.0 1.0
if-indirect 1.2 1.8 3.3 3.8 2.6 1.0
स्विच-तत्काल 2.0 1.1 2.0 1.0 2.8 1.3
स्विच-रेंज 38.1 10.6 2.6 7.3 20.9 10.4
स्विच-रेंज 2 31.9 8.3 2.0 4.5 9.5 6.9
स्विच-अप्रत्यक्ष-सरणी 35.2 9.6 4.2 5.5 10.7 8.6
सरणी-रैखिक-स्विच 3.6 4.1 4.5 10.0 4.7 2.7
सरणी-बाइनरी-स्विच 7.8 6.7 9.5 16.0 15.0 4.9
फ़ॉउलिंग संस्करणों के साथ विंडोज 7 32 बिट पर प्रदर्शन किया गया टेस्ट: क्रोम 21.0.1180.89m , फ़ायरफ़ॉक्स 15.0 , ओपेरा 12.02 , MSIE 9.0.8112 , सफारी 5.1.7 । लिनक्स 64 बिट बॉक्स पर नोड चलाया गया था क्योंकि विंडोज के लिए Node.js पर टाइमर रिज़ॉल्यूशन 1ms के बजाय 10ms था।
अगर-तत्काल
यह सभी परीक्षण किए गए वातावरणों में सबसे तेज़ है, सिवाय ... ड्रमोल MSIE के! (अचंभा अचंभा)। इसे लागू करने के लिए यह अनुशंसित तरीका है।
if (val < 1000) { /*do something */ } else
if (val < 2000) { /*do something */ } else
...
if (val < 30000) { /*do something */ } else
अगर-अप्रत्यक्ष
यह एक संस्करण है, switch-indirect-array
लेकिन if
इसके बजाय -statements के साथ और switch-indirect-array
लगभग सभी परीक्षण किए गए वातावरण की तुलना में बहुत तेज़ प्रदर्शन करता है।
values=[
1000, 2000, ... 30000
];
if (val < values[0]) { /* do something */ } else
if (val < values[1]) { /* do something */ } else
...
if (val < values[29]) { /* do something */ } else
स्विच तत्काल
यह सभी परीक्षण किए गए वातावरण में बहुत तेज़ है, और वास्तव में MSIE में सबसे तेज़ है। यह तब काम करता है जब आप एक सूचकांक प्राप्त करने के लिए गणना कर सकते हैं।
switch (Math.floor(val/1000)) {
case 0: /* do something */ break;
case 1: /* do something */ break;
...
case 29: /* do something */ break;
}
स्विच दूरी
यह ओपेरा को छोड़कर सभी परीक्षण किए गए वातावरणों में सबसे तेज़ से लगभग 6 से 40 गुना धीमा है जहां इसे लगभग डेढ़ गुना लंबा लगता है। यह धीमा है क्योंकि इंजन को प्रत्येक मामले के लिए दो बार मूल्य की तुलना करना पड़ता है। हैरानी की बात यह है कि क्रोम में सबसे तेज संचालन की तुलना में इसे पूरा करने में क्रोम को लगभग 40 गुना अधिक समय लगता है, जबकि एमएसआईई को केवल 6 गुना लंबा समय लगता है। लेकिन 1337ms (!) में MSIE के पक्ष में वास्तविक समय का अंतर केवल 74ms था।
switch (true) {
case (0 <= val && val < 1000): /* do something */ break;
case (1000 <= val && val < 2000): /* do something */ break;
...
case (29000 <= val && val < 30000): /* do something */ break;
}
स्विच-सीमा 2
यह एक वेरिएंट है, switch-range
लेकिन केवल एक ही मामले में तुलना करता है और इसलिए तेजी से, लेकिन अभी भी ओपेरा को छोड़कर बहुत धीमा है। केस स्टेटमेंट का क्रम महत्वपूर्ण है क्योंकि इंजन प्रत्येक मामले का स्रोत कोड ऑर्डर ECMAScript262: 5 12.11 में परीक्षण करेगा
switch (true) {
case (val < 1000): /* do something */ break;
case (val < 2000): /* do something */ break;
...
case (val < 30000): /* do something */ break;
}
स्विच-अप्रत्यक्ष सरणी
इस प्रकार में श्रेणियाँ एक सरणी में संग्रहीत की जाती हैं। यह सभी परीक्षण किए गए वातावरण में धीमा है और क्रोम में बहुत धीमा है।
values=[1000, 2000 ... 29000, 30000];
switch(true) {
case (val < values[0]): /* do something */ break;
case (val < values[1]): /* do something */ break;
...
case (val < values[29]): /* do something */ break;
}
सरणी रेखीय-खोज
यह किसी सरणी में मानों की रेखीय खोज और निश्चित मानों के साथ स्विच स्टेटमेंट का संयोजन है। जब कोई रनटाइम तक मानों को ज्ञात नहीं है, तो इसका उपयोग करना चाहता है। यह प्रत्येक परीक्षण किए गए वातावरण में धीमा है, और MSIE में लगभग 10 गुना लंबा है।
values=[1000, 2000 ... 29000, 30000];
for (sidx=0, slen=values.length; sidx < slen; ++sidx) {
if (val < values[sidx]) break;
}
switch (sidx) {
case 0: /* do something */ break;
case 1: /* do something */ break;
...
case 29: /* do something */ break;
}
सरणी-द्विआधारी स्विच
यह एक प्रकार है, array-linear-switch
लेकिन एक द्विआधारी खोज के साथ। दुर्भाग्य से यह रैखिक खोज की तुलना में धीमी है। मुझे नहीं पता कि यह मेरा कार्यान्वयन है या यदि रैखिक खोज अधिक अनुकूलित है। यह भी हो सकता है कि कीस्पेस छोटा है।
values=[0, 1000, 2000 ... 29000, 30000];
while(range) {
range = Math.floor( (smax - smin) / 2 );
sidx = smin + range;
if ( val < values[sidx] ) { smax = sidx; } else { smin = sidx; }
}
switch (sidx) {
case 0: /* do something */ break;
...
case 29: /* do something */ break;
}
निष्कर्ष
यदि प्रदर्शन महत्वपूर्ण है, उपयोग if
-statements या switch
तत्काल मूल्यों के साथ।