जावास्क्रिप्ट स्विच बनाम यदि… और यदि… और


143

दोस्तों मेरे पास कुछ सवाल हैं:

  1. क्या switchकथन और क के बीच जावास्क्रिप्ट में प्रदर्शन अंतर हैif...else ?
  2. यदि हां तो क्यों?
  3. के व्यवहार है switchऔर if...elseब्राउज़रों में अलग है? (फ़ायर्फ़ॉक्स, आईई, क्रोम, ओपेरा, सफारी)

इस प्रश्न को पूछने का कारण यह है कि मुझे switchफ़ायरफ़ॉक्स में लगभग अधिकतम मामलों वाले बयान पर बेहतर प्रदर्शन मिलता है ।


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

CreateConditionals(string name, string arrayofvalues, string arrayofActions)

ध्यान दें arrayofvalues एक अल्पविराम से अलग की गई सूची है।

यह क्या पैदा करता है

function [name] (value) {
  if (value == [value from array index x]) {
     [action from array index x]
  }
}

नोट: कहां [name] = सर्वरसाइड फ़ंक्शन में नाम दिया गया है

अब मैंने फंक्शन के आउटपुट को TextArea में डाला, फ़ंक्शन के माध्यम से पार्स करने के लिए कुछ जावास्क्रिप्ट कोड लिखे और इसे सेट के रूप में परिवर्तित किया case बयानों के दिया।

अंत में मैं फ़ंक्शन चलाता हूं और यह ठीक चलता है लेकिन IE और फ़ायरफ़ॉक्स में प्रदर्शन भिन्न होता है।


1
मैं यह जांचने के लिए एक कोड नमूने का सुझाव दूंगा कि क्या इष्टतम है। मेरा मतलब है, वहाँ एक कारण हो सकता है आप यह पूछ रहे हैं, है ना?
jcolebrand

कृपया पोस्ट करें कि आप क्या कर रहे हैं, क्योंकि मेरे लंबे अनुभव में बहुत कम मामले हैं, जिसके लिए मैं 100-केस स्विच स्टेटमेंट या 100-भाग कहूंगा यदि / अन्यथा श्रृंखला एक अच्छा विचार था।
नुकीले

क्षमा करें दोस्तों 100s नहीं बल्कि हजारों स्थितियां
जॉन हार्टसॉक

2
हर कोई, इनपुट के लिए धन्यवाद। लेकिन मेरी समस्या वास्तव में if और swith मूर्तियों के बीच का अंतर नहीं थी। यह कथन के अंदर चल रहा कोड था। आपकी मदद के लिए आप सभी को +1। अनिश्चितता के लिए क्षमा करें। कभी-कभी आपको समाधान खोजने के लिए किसी अन्य व्यक्ति के साथ केवल बातें करने की आवश्यकता होती है।
जॉन हार्टसॉक

जवाबों:


113

सामान्यताओं में उत्तर देना:

  1. हाँ, आमतौर पर।
  2. अधिक जानकारी यहां देखें
  3. हां, क्योंकि प्रत्येक के पास एक अलग जेएस प्रसंस्करण इंजन है, हालांकि, नीचे की साइट पर एक परीक्षण चलाने में, स्विच हमेशा बाहर किया जाता है, बड़ी संख्या में पुनरावृत्तियों पर।

परीक्षण स्थल


1
यदि आप चाहते हैं कि कब, किस सशर्त का उपयोग करना है, तो लेख में एक खंड के लिए एक सीधा लिंक यह है कि:
लगाया

2
@ टॉमी अच्छा लेख, साझा करने के लिए धन्यवाद। हालांकि लेख में कहा गया है कि जेएस में बयानों switchऔर if/thenबयानों के बीच एक नगण्य प्रदर्शन अंतर है । लेख में कहा गया है कि यह धब्बेदार switchअनुकूलन और जेएस इंजन के अलग-अलग तरीकों से काम करता है। Hindi Quote:Since most JavaScript engines don’t have such optimizations, performance of the switch statement is mixed.
जैस्पर

3
क्या इस विवरण में कुछ मात्रात्मक दिखाया गया है? यह बहुत सारे "सर्वोत्तम प्रथाओं / समय से पहले अनुकूलन" अनुमान की तरह पढ़ता है। यह 7 साल पहले भी लिखा गया था, इसलिए जावास्क्रिप्ट अनुकूलन इस समय में काफी बदल गए हैं। संकलित भाषाओं में, इन तीन परिचालनों के बीच प्रदर्शन अंतर "देखभाल के लिए लगभग कभी महत्वपूर्ण नहीं" है। उन चीजों का अनुकूलन न करें जो वास्तविक प्रदर्शन को प्रभावित नहीं करेंगी। पठनीयता का अनुकूलन करें।
थॉमसन कोमर

3
@ टॉमी « अधिक जानकारी यहां देखें » 404 देता है, क्या था?
LogicDaemon

2
@LogicDaemon - IIRC कुछ oRielly टेक्स्टबॉक्स की एक कड़ी है जो कुछ अनिश्चित जेएस प्रदर्शन विचार / चर्चा में मिला
टॉमी

61

कभी-कभी इसका उपयोग न तो बेहतर है। उदाहरण के लिए, "प्रेषण" स्थिति में, जावास्क्रिप्ट आपको चीजों को पूरी तरह से अलग करने की अनुमति देता है:

function dispatch(funCode) {
  var map = {
    'explode': function() {
      prepExplosive();
      if (flammable()) issueWarning();
      doExplode();
    },

    'hibernate': function() {
      if (status() == 'sleeping') return;
      // ... I can't keep making this stuff up
    },
    // ...
  };

  var thisFun = map[funCode];
  if (thisFun) thisFun();
}

ऑब्जेक्ट बनाकर मल्टी-वे ब्रांचिंग स्थापित करने के बहुत सारे फायदे हैं। आप कार्यक्षमता को गतिशील रूप से जोड़ और हटा सकते हैं। आप डेटा से प्रेषण तालिका बना सकते हैं। आप इसे प्रोग्रामेटिक रूप से जांच सकते हैं। आप अन्य कार्यों के साथ हैंडलर का निर्माण कर सकते हैं।

एक "केस" के बराबर पाने के लिए एक फंक्शन कॉल का अतिरिक्त ओवरहेड है, लेकिन एक विशेष कुंजी के लिए फ़ंक्शन को खोजने के लिए हैश लुकअप का लाभ (जब बहुत सारे मामले हैं)।


2
आपकी रणनीति अच्छी है और मैं अक्सर इसका इस्तेमाल करता हूं। लेकिन जैसा कि @Michael Geary stackoverflow.com/ द्वारा बताया गया है । मैप वेरिएबल को डिस्पैच संदर्भ से बाहर घोषित किया जाना चाहिए अन्यथा इसे हमेशा मूल्यांकन किया जाएगा।
डैनियल सैन्टाना

@DanielSantana सच है, लेकिन मुझे संदेह है कि यह काफी महंगा है। विशेष रूप से, एक बार एक फ़ंक्शन को शुरू में पार्स किया जाता है, क्योंकि कोड स्थिर होने की आवश्यकता नहीं होती है।
नुकीले

18

एक switchऔर if...else if...elseछोटे के बीच प्रदर्शन अंतर , वे मूल रूप से एक ही काम करते हैं। उनके बीच एक अंतर जो फर्क कर सकता है वह यह है कि परीक्षण करने के लिए अभिव्यक्ति का मूल्यांकन केवल एक बार किया जाता है, switchजबकि प्रत्येक के लिए इसका मूल्यांकन किया जाता हैif । यदि अभिव्यक्ति का मूल्यांकन करना महंगा है, तो इसे एक बार करना सौ बार करने की तुलना में तेजी से होता है।

उन कमांड के कार्यान्वयन में अंतर (और सामान्य रूप से सभी स्क्रिप्ट) ब्राउज़रों के बीच काफी भिन्न होता है। विभिन्न ब्राउज़रों में समान कोड के लिए बड़े प्रदर्शन के अंतर को देखना आम है।

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


7
  1. यदि कोई अंतर है, तो यह कभी भी ध्यान देने योग्य नहीं होगा।
  2. एन / ए
  3. नहीं, वे सभी समान रूप से कार्य करते हैं।

मूल रूप से, जो भी कोड सबसे पठनीय बनाता है उसका उपयोग करें। निश्चित रूप से ऐसे स्थान हैं जहां एक या दूसरे निर्माण क्लीनर के लिए बनाता है, अधिक पठनीय और अधिक रखरखाव योग्य है। यह कहीं अधिक महत्वपूर्ण है कि शायद जावास्क्रिप्ट कोड में कुछ नैनोसेकंड की बचत हो।


5
विशेष रूप से जावास्क्रिप्ट में, शब्दार्थ और पठनीयता (और इसलिए बनाए रखने की क्षमता) के बीच किसी भी स्थानीयकृत प्रदर्शन अंतर को ट्रम्प करता है if..elseऔर switchएक अद्वितीय ब्राउज़र संस्करण कंप्यूटर हार्डवेयर और ओएस संयोजन के कारण होता है।
Jball

2
मुझे नहीं पता कि अगर मैं सहमत हूं, तो यह वास्तव में देखा जा सकता है यदि इसे एक लूप के साथ प्रयोग किया जाता है, एक बड़ा डेटाबेस, एक पेड़ को पीछे करना आदि
ghoppe

2
मैं निश्चित रूप से असहमत हूं। चूंकि वेब एप्लिकेशन अधिक से अधिक जटिल हो जाते हैं, इसलिए यह अंतर एप्लिकेशन के लिए महत्वपूर्ण हो सकता है और ब्राउज़रों पर निर्भर हो सकता है।
जोशवर्मेयर

7
महत्वपूर्ण बात यह है कि स्वच्छ, बनाए रखने योग्य कोड लिखना है। जब कोई प्रदर्शन समस्या देखी जाती है - प्रोफ़ाइल। फिर निर्धारित करें कि किस कोड को ठीक करना है। प्रदर्शन के मुद्दों के लिए स्थिरता का त्याग न करें।
जॉन बेनेडिक्टो

3
'if if if else ...' O (n) है, जबकि 'switch' या तो O (1) या O (log (n)) है। आप ईमानदारी से कैसे कह सकते हैं कि अंतर कभी भी बड़ा नहीं हो सकता है? स्विच में लाखों मामले हैं (यदि कोड उत्पन्न होता है तो आसानी से संभव है) और आप निश्चित रूप से इसे कम से कम कहने के लिए नोटिस करेंगे।
ड्रैगनट्रोट

6

सिंटैक्स के अलावा, एक स्विच को एक पेड़ का उपयोग करके कार्यान्वित किया जा सकता है जो इसे बनाता है O(log n), जबकि एक / अन्य को एक O(n)प्रक्रियात्मक दृष्टिकोण के साथ लागू किया जाना है । अधिक बार वे दोनों प्रक्रियात्मक रूप से संसाधित होते हैं और केवल अंतर सिंटैक्स होता है, और इसके अलावा यह वास्तव में मायने रखता है - जब तक कि आप सांख्यिकीय रूप से 10k मामलों को टाइप नहीं कर रहे हैं यदि / और वैसे भी?


7 साल बाद ... मैं यह नहीं देखता कि निरंतर संख्यात्मक मामले के मूल्यों के मामले में पेड़ का कार्यान्वयन कैसे संभव है।
एड स्टब

4

नुकीले के जवाब के लिए एक विकल्प के रूप में एक वस्तु शाब्दिक के उपयोग का सुझाव है switchया if/ else। मुझे यह दृष्टिकोण भी पसंद है, लेकिन जवाब में कोड mapहर बार एक नई वस्तु बनाता dispatchहै जिसे फ़ंक्शन कहा जाता है:

function dispatch(funCode) {
  var map = {
    'explode': function() {
      prepExplosive();
      if (flammable()) issueWarning();
      doExplode();
    },

    'hibernate': function() {
      if (status() == 'sleeping') return;
      // ... I can't keep making this stuff up
    },
    // ...
  };

  var thisFun = map[funCode];
  if (thisFun) thisFun();
}

यदि mapबड़ी संख्या में प्रविष्टियाँ हैं, तो यह महत्वपूर्ण ओवरहेड बना सकता है। कार्रवाई मानचित्र को केवल एक बार सेट करना बेहतर है और फिर पहले से ही बनाए गए मानचित्र का उपयोग हर बार करें, उदाहरण के लिए:

var actions = {
    'explode': function() {
        prepExplosive();
        if( flammable() ) issueWarning();
        doExplode();
    },

    'hibernate': function() {
        if( status() == 'sleeping' ) return;
        // ... I can't keep making this stuff up
    },
    // ...
};

function dispatch( name ) {
    var action = actions[name];
    if( action ) action();
}

3

क्या एक स्विच स्टेटमेंट और एक if ... if if .... के बीच जावास्क्रिप्ट में प्रीफॉर्मेंस अंतर है?

मुझे नहीं लगता कि switchयह उपयोगी / छोटा है यदि आप कई if-elseस्थितियों को रोकना चाहते हैं।

क्या स्विच का व्यवहार और यदि ... और तो और ... ब्राउज़रों में भिन्न है? (फ़ायर्फ़ॉक्स, आईई, क्रोम, ओपेरा, सफारी)

व्यवहार सभी ब्राउज़रों में समान है :)


5
switch is useful/short if you want prevent multiple if-else conditions.हाँ साहब, बढ़िया पोस्ट।
नीक न्यूमैन

1
  1. कार्यक्षेत्र में कुछ मामलों में बहुत छोटे अंतर हो सकते हैं लेकिन प्रसंस्करण का तरीका ब्राउज़र पर निर्भर है, वैसे भी परेशान करने लायक नहीं है
  2. प्रसंस्करण के विभिन्न तरीकों की वजह से
  3. आप इसे एक ब्राउज़र नहीं कह सकते हैं यदि व्यवहार किसी भी तरह से अलग होगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.