2012-11-14 14 views
8

के बजाय ऑब्जेक्ट शाब्दिक का उपयोग करना स्विच और स्विच/ कथन में सर्वोत्तम प्रथाओं के बारे में बहुत सी चर्चाएं और टिप्पणियां हैं। मैंने लोगों को यह कहते हुए देखा है कि हम सभी को संभव होने पर स्विच करने के बजाय ऑब्जेक्ट शाब्दिक का उपयोग करना चाहिए।स्विच स्टेटमेंट

(function(test){ 
    var bar; 

    switch(bar) { 
     case 1: 
      bar = 'red'; 
      break; 
     case 2: 
      bar = 'blue'; 
      break; 
     case 3: 
      bar = 'yellow'; 
      break; 
     case 4: 
      bar = 'green'; 
      break; 
     case 5: 
      bar = 'black'; 
      break; 
    } 

    return bar; 
})(5); 

और गुजर गर्त एक वस्तु शाब्दिक:

इसलिए मैं इस मामले और एक स्विच के बीच reproduced किया है

(function(test){ 
    return { 1: 'red', 2: 'blue', 3: 'yellow', 4: 'green', 5: 'black' }[ test ]; 
})(5); 

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

क्या मेरा परीक्षण गलत है? इस मामले में एक या किसी अन्य विधि का उपयोग करने से पहले मुझे क्या विचार करना चाहिए? या शायद इस विषय के बारे में मैंने देखा है कि टिप्पणियां गलत हैं और मुझे बुनियादी बातों को बाईपास करने की कोशिश नहीं करनी चाहिए ...

+1

आपका परीक्षण ठीक है; आप गति के लिए स्मृति व्यापार कर रहे हैं (जो आप लगभग हमेशा कर सकते हैं)। आप समयपूर्व/माइक्रो-ऑप्टिमाइज़ेशन में भी व्यस्त हो सकते हैं। इसके अलावा, किसी ऑब्जेक्ट के साथ आप मनमाने ढंग से कोड नहीं चला सकते हैं (जब तक कि फ़ंक्शन कॉल के ऊपरी भाग पर मान लागू नहीं होते हैं)। सामान्य रूप से, अपने _algorithms_ को अनुकूलित करने के लिए पहले प्रयास करें, न कि आपके व्यक्तिगत कोड कॉल। – Phrogz

+2

ओह, प्रतीक्षा करें, आपके परीक्षण में एक समस्या है: आप प्रत्येक नई फ़ंक्शन कॉल के दौरान ऑब्जेक्ट शाब्दिक को फिर से चालू कर रहे हैं। उस ऑब्जेक्ट को पूर्व-आवंटित करें और पुनः प्रयास करें। साथ ही, ध्यान दें कि आधुनिक जेआईटी जेएस रनटाइम्स के साथ कोड के छोटे लूपों का भारी परीक्षण किया जाता है, जैसे कि निर्देश पुनः लिखने में लातें जो वास्तविक दुनिया के प्रदर्शन का संकेत नहीं दे सकती हैं। – Phrogz

+1

@Phrogz http://jsperf.com/switch-from-switches/4; हालांकि मैं अभी भी ऑब्जेक्ट नोटेशन का उपयोग करने का प्रशंसक नहीं हूं। – NullUserException

उत्तर

14

आप शायद पैमाने के प्रभाव देख रहे हैं: एक स्विच स्टेटमेंट O(n) है, जबकि हैश टेबल लुकअप (संभावित रूप से ऑब्जेक्ट लिटरल्स में विधियों को खोजने के लिए उपयोग किया जाता है) (amortized) O(1) है। लेकिन बिग-ओ उपाय केवल सटीक रूप से वर्णन करते हैं कि वास्तव में बड़े इनपुट पर प्रदर्शन स्केल कैसे होते हैं। आपके परीक्षण में, यह आश्चर्य की बात नहीं है कि पांच if कथन हैश टेबल लुकअप से तेज़ हैं।

तो मूल रूप से: आपके पास कितनी कुंजी होगी? यदि आपके पास केवल पांच कुंजी हैं, तो आप औसत 2.5 प्रति लुकअप पर हिट करेंगे, जिसे आपने एक हैश टेबल लुकअप से तेज़ दिखाया है। लेकिन क्या होगा यदि आपके पास 500 है? यह औसत 250 if कथन है - अभी भी एकल हैश लुकअप बनाम है। हैश टेबल (ऑब्जेक्ट शाब्दिक) दृष्टिकोण उस बिंदु पर लगभग निश्चित रूप से बेहतर है।

लेकिन अंतिम जवाब? सभी को यह सुनने से नफरत है, लेकिन यह एकमात्र आधिकारिक तरीका है: अपने वास्तविक उत्पादन कोड के साथ बेंचमार्क करें। यह दर्द है, लेकिन फिर आप निश्चित रूप से जानते हैं।

आशा है कि मदद करता है!

पुनश्च: यह अलग कोडन शैली वरीयता के सभी कारणों से जा रहा है, लेकिन मैं वास्तव में उस में पाने के लिए नहीं चाहता ...

+0

धन्यवाद @ xavier-holt, यह एक स्पष्ट, उद्देश्यपूर्ण और निर्देशक उत्तर है। – rayfranco

+4

मैं सिर्फ यह ध्यान रखना चाहता हूं कि कथन कथन ओ (लॉगएन) हैं यदि विवरण आवृत्ति द्वारा आदेश दिया जा सकता है। इसके अलावा, मेरा मानना ​​है कि जब प्रमुख कुंजी int या स्ट्रिंग होती है तो प्रमुख जट स्विच स्टेटमेंट को अनुकूलित करते हैं। – Indolering

2

खैर मैं अपने कोड (here) संशोधित आप जब देखने के लिए ऑब्जेक्ट धारणा बेहतर होगी।

जेवियर वर्णित बस के रूप में है, लेकिन इसके बारे में 500 मोटे तौर पर 40 मामलों में जाने के लिए नहीं था स्विच ..

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

+1

एक "अभिन्न" के लिए लुकअप? क्षमा करें कि इस संदर्भ में क्या ... क्या आपका मतलब "पूर्णांक" था? – jbyrd

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

  • कोई संबंधित समस्या नहीं^_^