2010-08-03 12 views
14

संभव डुप्लिकेट:
is “else if” faster than “switch() case” ?"अगर" बनाम "स्विच"

मैं हाल ही में स्थितियों का एक बहुत का सामना किया है, जहां मैं बहुत ही सरल सशर्त है और आवेदन प्रवाह शाखा की जरूरत है। पूरा मैं क्या कर रहा हूँ की "सरल" का अर्थ सिर्फ एक सादे पुराने if/elseif कथन है:

if($value == "foo") { 
    // ... 
} elseif($value == "bar") { 
    // ... 
} elseif($value == "asdf" || $value == "qwerty") { 
    // ... 
} 

... लेकिन मैं भी कुछ ऐसा विचार कर रहा हूँ:

switch($value) { 
    case "foo": 
     // ... 
     break; 
    case "bar": 
     // ... 
     break; 
    case "qwer": 
    case "asdf": 
     // ... 
} 

यह लगता है थोड़ा कम पठनीय, लेकिन शायद यह अधिक प्रदर्शनकारी है? हालांकि, जब वहाँ अधिक से अधिक कर रहे हैं "या" सशर्त में भाव, ऐसा लगता है कि स्विच बयान और अधिक पठनीय और उपयोगी है:

switch($value) { 
    case "foo": 
     // ... 
     break; 
    case "bar": 
    case "baz": 
    case "sup": 
     // ... 
     break; 
    case "abc": 
    case "def": 
    case "ghi": 
     // ... 
     break; 
    case "qwer": 
    case "asdf": 
     // ... 
} 

मैं भी विकल्प जहां कोड प्रवाह सरणियों का उपयोग कर branched है देखा है और कार्य:

function branch_xyz() {/* ... */} 
function branch_abc() {/* ... */} 
function branch_def() {/* ... */} 

$branches = array(
    "xyz"=>"branch_xyz", 
    "abc"=>"branch_abc", 
    "def"=>"branch_def" 
); 
if(isset($branches[$value])) { 
    $fname = $branches[$value]; 
    $fname(); 
} 

यह अंतिम विकल्प भी शायद, एक से अधिक फ़ाइलों भर में वितरण किया जा रहा है को लाभ मिलता है, हालांकि यह बहुत बदसूरत है।

प्रदर्शन, पठनीयता और उपयोग में आसानी के मामले में आपको सबसे कम व्यापारिक तरीकों के साथ सबसे अधिक फायदे हैं?

+1

का उपयोग करते हुए 'switch' आपके द्वारा निर्दिष्ट स्थिति की वस्तु के रूप में बेहतर है:

मैं अवधारणा यहाँ बारे में लिखा था। – Sarfraz

+2

प्रदर्शन इसमें वास्तव में भी कारक नहीं है। पहले पठनीय कोड लिखें, फिर प्रोफ़ाइल और ऑप्टिमाइज़ करें जहां बाद में आवश्यक हो। –

+0

डुप्लिकेट, आदि का डुप्लिकेट http://stackoverflow.com/questions/3387758/java-case-statment-or-if-statement- क्षमता- दर्शक –

उत्तर

27

व्यक्तिगत रूप से, मुझे स्विच बहुत अधिक पठनीय लगता है। यहाँ कारण नहीं है:

if ($foo == 'bar') { 
} elseif ($foo == 'baz') { 
} elseif ($foo == 'buz') { 
} elseif ($fou == 'haz') { 
} 

ऐसा संघनित, आप आसानी से यात्रा तक देख सकते हैं (यह एक टाइपो है, या एक ईमानदार अंतर हो)। लेकिन एक स्विच के साथ, आप अप्रत्यक्ष रूप से पता है क्या मतलब था:

switch ($foo) { 
    case 'bar': 
     break; 
    case 'baz': 
     break; 
    case 'buz': 
     break; 
    case 'haz': 
     break; 
} 

साथ ही, जो आसान है पढ़ने के लिए:

if ($foo == 'bar' || $foo == 'baz' || $foo == 'bat' || $foo == 'buz') { 
} 

या

case 'bar': 
case 'baz': 
case 'bat': 
case 'buz': 
    break; 

एक प्रदर्शन दृष्टिकोण से ... ठीक है प्रदर्शन के बारे में चिंता मत करो। जब तक आप उनमें से कुछ हज़ारों को एक तंग पाश के अंदर नहीं कर रहे हैं, तो आप अंतर को बताने में भी सक्षम नहीं होंगे (अंतर कम होने पर माइक्रो-सेकंड रेंज में अंतर होगा)।

उस विधि के लिए जाएं जिसे आप सबसे अधिक पठनीय पाते हैं। यह महत्वपूर्ण हिस्सा है। सूक्ष्म अनुकूलन करने की कोशिश मत करो। याद रखें, Premature Optimization Is The Root Of All Evil ...

+1

सावधान रहें कि स्विच आपको [ढीली तुलना] (http://stackoverflow.com/q/3525614/632951) के कारण ** झूठी ** नकारात्मक और झूठी सकारात्मक प्रदान करेगा। यहां पर, 'स्विच' एक कोड गंध और सुरक्षा बोन आईपीएस वास्तव में है। इसके बजाय सरणी कुंजी का प्रयोग करें। – Pacerier

+0

@Pacerier, स्विच क्यों सुरक्षा बाने है? –

+3

@ ryabenko-pro, लूज तुलना आपको सूक्ष्म बग देगा: 'स्विच (0) {केस नल: इको' नल '; टूटना; डिफ़ॉल्ट: गूंज 'शून्य नहीं';} ' – Pacerier

1

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

44

मुझे पता है, माइक्रो-ऑप्टिमाइज़ेशन खराब है।

<?php 
$numof = 100000; 
$file = fopen('benchmark.php', 'w'); 
if (!$file) die('file error'); 
fwrite($file, '<pre><?php' . "\n" . 'echo $i = $_GET[\'i\'], "\n";' . "\n"); 

fwrite($file, 
'$start = microtime(true); 
if ($i == 0) {}' . "\n"); 
for ($i = 1; $i < $numof; ++$i) { 
    fwrite($file, 'elseif($i == '.$i.') {}'. "\n"); 
} 
fwrite($file, 
'echo \'elseif took: \', microtime(true) - $start, "\n";' . "\n"); 

fwrite($file, 
'$start = microtime(true); 
switch($i) {' . "\n"); 
for ($i = 1; $i < $numof; ++$i) { 
    fwrite($file, 'case '.$i.': break;'. "\n"); 
} 
fwrite($file, 
'} 
echo \'switch took: \', microtime(true) - $start, "\n";' . "\n"); 

डेटा परिणामस्वरूप (numof = 100000 के लिए):

i: 0 
elseif took: 6.2942504882812E-5 
switch took: 3.504753112793E-5 

i: 10 
elseif took: 6.4849853515625E-5 
switch took: 4.3869018554688E-5 

i: 100 
elseif took: 0.00014805793762207 
switch took: 0.00011801719665527 

i: 1000 
elseif took: 0.00069785118103027 
switch took: 0.00098896026611328 

i: 10000 
elseif took: 0.0059938430786133 
switch took: 0.0074150562286377 

i: 100000 (first non-existing offset) 
elseif took: 0.043318033218384 
switch took: 0.075783014297485 

साथ मेरे पुराने और धीमी गति से खिड़कियां मशीन पर स्क्रिप्ट चलाने की है, लेकिन उत्सुक के रूप में मैं कर रहा हूँ, मैं एक छोटे से बेंचमार्क इस स्क्रिप्ट का उपयोग किया था PHP 5.3.1 या 5.3.2, सही पता है।

+10

+1 वास्तव में प्रदर्शन अंतर को मापने का प्रयास करने के लिए कुछ सवाल करने के लिए प्रश्न पूछता है। – Kmeixner

3

आपको पॉलिमॉर्फिज्म का उपयोग संरचनाओं जैसे नियंत्रण या स्विच करने के विकल्प के रूप में करने पर विचार करना चाहिए। यदि आपके पास बहुत सारे विकल्प हैं, तो यह विशेष रूप से सुविधाजनक है, क्योंकि यह नियंत्रण तर्क को बहुत सरल बना सकता है। http://codeutopia.net/blog/2009/02/02/avoiding-endless-switch-case-structures-with-classes/

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