php - "if"与 "switch"

标签 php if-statement switch-statement branch

<分区>

Possible Duplicate:
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 语句似乎更具可读性和实用性:

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

我还看到了使用数组和函数对代码流进行分支的选项:

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();
}

这最后一个选项可能还具有跨多个文件分发的好处,尽管它非常丑陋。

在性能、可读性和易用性方面,您认为哪个优势最大且折衷最少?

最佳答案

我知道,微优化是不好的。但尽管我很好奇,我还是使用这个脚本做了一些基准测试:

<?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 的旧而慢的 Windows 机器上运行了脚本,我不知道是不是知道。

关于php - "if"与 "switch",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3399755/

相关文章:

php - 上传图片时如何防止提交空表单?

javascript - jquery load() 将显示和不透明度放在元素样式中

php - 如何在 php 中使用路径信息?

c# - 切换编程语言

java - 带月份的 Switch 语句

php - var/www/文件夹外的图片链接? (Linux,PHP)

PHP - 如何从 python 程序调用特定函数(Python 3.4、PHP 7、CodeIgniter)

python - 如何在 python 3 中使用输入流?

c# - 有条件地禁用复选框

Java if 语句没有转到正确的语句