2013-08-20 5 views
7

मैंने http://www.jquery4u.com/javascript/shorthand-javascript-techniques/ पर एक पोस्ट देखी जहां वह स्विच स्टेटमेंट का उपयोग करने के वैकल्पिक तरीके के बारे में बात करता है।जेएसओएन सिंटैक्स बनाम स्विच स्टेटमेंट जावास्क्रिप्ट

मैंने नीचे एक स्निपेट बनाया है, लेकिन मुझे यकीन नहीं है कि वैकल्पिक 99% धीमा क्यों है।

function doX(){} 
function doY(){} 
function doN(){} 
var something = 1; 

var cases = { 
    1: doX, 
    2: doY, 
    3: doN 
}; 
if (cases[something]) { 
    cases[something](); 
} 

http://jsperf.com/alternateswitch

किसी भी विचार?

+0

बस/अगर वह इसके बारे में बात कर रहा है तो शॉर्टेंड संस्करण की तरह, यह छोटा है, लेकिन यह बिल्कुल तेज़ नहीं है। –

+2

कि "JSON" वाक्यविन्यास सिर्फ एक वस्तु है। – Blender

+6

मुझे यह भी लगता है कि परिणामों में आपके अंतर का एक बड़ा हिस्सा jsperf का दुरुपयोग है। परीक्षण के सेटअप हिस्से में कोई भी समय कोड जोड़ना सुनिश्चित करें। यहां आपके कोड का उपयोग करने वाला एक उदाहरण है: http: // jsperf।com/alternateswitch/3 –

उत्तर

3

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

यदि आपके कोड का पुन: उपयोग किया जा रहा है, तो आप कुछ सुधार देखेंगे, यानी आप cases का मान रखते हैं; मैंने this test case में लगभग 20-30% के अंतर को माप लिया है, इस पर निर्भर करता है कि कौन सा मामला अधिक बार होता है।

यह कहा गया है कि इस तरह का एक पृथक प्रदर्शन परीक्षण उपयोगी नहीं होगा जब तक कि आपका कोड एक तंग पाश के अंदर नहीं चला जाता है, क्योंकि परीक्षण के मामले मेरे घर कंप्यूटर पर प्रति सेकंड 50 एम + ऑपरेशंस पर चलते हैं। इसलिए दोनों के बीच मतभेद अन्य कारकों पर आधारित होना चाहिए, जैसे कि कोड स्पष्टता या तथ्य यह है कि switch कथन गड़बड़ करना आसान है यदि आप break; को एक बयान देना भूल जाते हैं।

+0

आपका परीक्षण केस अनुचित है। आप सहयोगी सरणी दो बार देख रहे हैं। – invisal

+0

@invisal यह मूल कोड है और अतिरिक्त लुकअप के बिना कोड कड़ाई से 'स्विच' जैसा नहीं है। –

7

कि "JSON" वाक्यविन्यास सिर्फ एक वस्तु है। साथ ही, आपकी तुलना यहां थोड़ी अनुचित है, क्योंकि आप एक सिंगल टाइम लूप को एक नया ऑब्जेक्ट बनाते हैं, जो कुछ हद तक महंगा है।

आप सेटअप अनुभाग के लिए ऑब्जेक्ट निर्माण ले जाते हैं, गति अंतर neglibile हो जाता है: http://jsperf.com/alternateswitch/4

आप if बयान निकालते हैं, तो वस्तु (कम से कम मेरे लिए) एक बालक तेजी से हो जाएगा: http://jsperf.com/alternateswitch/5। अतिरिक्त संपत्ति लुकअप और सच्चाई की जांच इसे धीमा कर देती है।

3
  • मेरा मानना ​​है कि जावास्क्रिप्ट ऑब्जेक्ट एक सहयोगी सरणी है जो आमतौर पर हैश तालिका के रूप में लागू होती है। प्रत्येक लुकअप को हैशिंग फ़ंक्शन के माध्यम से पर जाने की कुंजी की आवश्यकता होती है। हैशिंग फ़ंक्शन डबल ब्लेड की तरह है। एक छोटे आकार के डेटा के लिए, यह एक if-elseif-else से धीमा होगा। हालांकि, बड़े डेटा के लिए, यह सामान्य रूप से बेहतर होगा अगर अन्यथा-
  • यह बहुत अनुचित है कि आप switch का पक्ष ले रहे हैं, तो आप यह बनाते हैं कि आप जिस चर के लिए खोज रहे हैं वह पहले मामले में है। इसलिए, switch के लिए जटिलता आपके परीक्षण के लिए ओ (1) है।
+1

हू, मैंने कभी अनुमान लगाया नहीं होगा कि स्विच स्टेटमेंट में मामलों का क्रम वास्तव में महत्वपूर्ण प्रदर्शन प्रभाव डालता है: http://jsperf.com/alternateswitch/8 – Blender

+0

स्विच के लिए कोड जटिलता हमेशा ओ (1) होती है बीटीडब्ल्यू :) –

+0

@ जैक, यदि आपके पास एन मामले हैं, तो स्विच की जटिलता हमेशा ओ (1) नहीं होती है। मेरा मानना ​​है कि जावास्क्रिप्ट में 'स्विच' समान रूप से लागू किया गया है, अन्यथा, एक कूद-तालिका के रूप में नहीं। – invisal

1

आमतौर पर switch कथन कंपाइलर/दुभाषिया द्वारा अनुकूलित किए जाते हैं। वे if-else बयान से भी तेज हैं। switch कथन के बजाय JSON ऑब्जेक्ट का उपयोग करके, आप जावास्क्रिप्ट इंजन अनुकूलन को छोड़ रहे हैं।

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