9
回答
请问这二种哪种执行效率高!
科大讯飞通用文字识别100000次/天免费使用。立即申请   

//操作值
$action=empty($_GET['action'])?'':trim($_GET['action']); //action值
$do=empty($_GET['do'])?'':trim($_GET['do']);    //do值
$id=empty($_GET['id'])?'':trim($_GET['id']);    //id值

//执行页面
switch ($action){
 case "":
   include('action/index.php');  //首页
   break;
 case "info":
   include('action/info.php');   //信息
   break;
 case "sell":
   include('action/sell.php');   //拜访
   break;
 case "doc":
   include('action/doc.php');    //公告
   break;
 case "report":
   include('action/report.php'); //报表
   break;
 case "config":
   include('action/config.php'); //配置
   break;
 case "role":
   include('action/role.php');   //角色
   break;
 case "user":
   include('action/user.php');   //用户
   break;
 case "data":
   include('action/data.php');   //数据
   break;
 default:
   echo "404!";
}

还是

if($action=""){include('action/index.php');  //首页
}

if($action="info"){include('action/info.php');  //首页
}

 

请问这二种哪种执行效率高!

PHP
举报
彭哥
发帖于6年前 9回/397阅
共有9个答案 最后回答: 6年前

引用来自“false”的答案

理论上switch高........不过.....执行几万次估计有几毫秒的效率差吧....而且可能因为include的I/O随机效率问题..导致结果相反......

这个我不认同。从理论上, switch 和 if else 方式,(后者不是楼主的第二种写法是肯定的),if else是更高的。

平均概率下,switch的复杂度是 O(N/2),而if else如果是可分层每个分支均可描述时,则为 O(log2 (N))。如2叉树访问任意叶子,平均经过的结点数目的计算一样。

当然楼主的代码是脚本,上述这种速度差异体现不出来,因为判断的成本并不高。

switch只有在一种情况下,会比较高,还需要编译器特定的编译支持。基本原理如下

swtich (var){

case 1:

    break;

case 2:

    break;

case 3:

    break;

}

编译器会针对上述3个入口,确定出一个跳转的地址换算公式。比如无论哪两个case ,之间,假设指令所占用空间,最高的都是50个byte,则会采用如下方式进行跳转,都是伪汇编,LOCAL_JMP表示从当前位置跳多远并PC寄存器再累加。

LOCAL_JMP VAR * 50

但这种方式,我只是见过,没见过大范围使用的。因为对于case 和case之间的指令代码所占空间的计算,会有多次编译器的优化操作。而且仅局限在case 每次只有一个枚举类型中。如果如下

case 1,2,3,4,5:

case 6,7,8,9:

就玩不转了。

虽然可以保持良好的设计,如case 每种枚举都不一样时,使用switch展开,但是如果每个case的代码片长度差异过大,或者编译器比较弱智,未必会有上述优化的情况出现。反而更慢。能不要让编译器动脑筋的事情,建议不要折磨编译,哈。

--- 共有 9 条评论 ---
彭哥回复 @中山野鬼 : 支持,我提出一个支程式的系统,居然都莫然,也不晓得是没可能实现,还是不屑一顾!我相信前者! 6年前 回复
中山野鬼回复 @彭哥 : 明了和高效并不矛盾。看你理解逻辑的能力了。好程序员一个标准就是复杂的问题,简单解决。 6年前 回复
彭哥回复 @中山野鬼 : 我也是没办法,要写得代码明了,又要简单,不得不用套嵌 6年前 回复
中山野鬼回复 @彭哥 : 套来套去并不好。你应该优化逻辑,然后分层判断。最好出现嵌套判断时用子函数方式实现。C就方便了,可以宏。 6年前 回复
彭哥回复 @中山野鬼 : 是啊,有else情况不同!不过我想在switch中用if 呵呵不晓得行不? 6年前 回复
理论上switch高........不过.....执行几万次估计有几毫秒的效率差吧....而且可能因为include的I/O随机效率问题..导致结果相反......

如果按照你第二种的写法的话,效率应该是switch的高。不过不考虑IO差别不大

 我习惯写 if elseif else, 或者这么写

do
{
    if($action=""){
        include('action/index.php');  //首页
        break;
    }

    if($action="info"){
        include('action/info.php');  //首页
        break;
    }
} while(0);

其实没有大的差别, 理论上if else if会高一点,switch会一个一个比较, 与if xx do xx ; if xx do xx...效率是基本一致的,而if else if只要满足了某个if 就不会再去比较else里面的if;如果switch加上一个break就会多一个跳转指令,这实质上也会慢一些。 但从可读性上讲,switch对条件比较多时要清楚一些。
顶部