对于多个if条件判断的情况下,我们使用switch来代替ifelse对于代码来说会更加的清晰明了,那么他们的效率对比呢?从PHP手册中发现有人已经对比过了,自己也用他的代码进行了实验:


$s = time();
for ($i = 0; $i < 1000000000; ++$i) {
$x = $i % 10;
if ($x == 1) {
$y = $x * 1;
} elseif ($x == 2) {
$y = $x * 2;
} elseif ($x == 3) {
$y = $x * 3;
} elseif ($x == 4) {
$y = $x * 4;
} elseif ($x == 5) {
$y = $x * 5;
} elseif ($x == 6) {
$y = $x * 6;
} elseif ($x == 7) {
$y = $x * 7;
} elseif ($x == 8) {
$y = $x * 8;
} elseif ($x == 9) {
$y = $x * 9;
} else {
$y = $x * 10;
}
}
print("if: " . (time() - $s) . "sec\n"); $s = time();
for ($i = 0; $i < 1000000000; ++$i) {
$x = $i % 10;
switch ($x) {
case 1:
$y = $x * 1;
break;
case 2:
$y = $x * 2;
break;
case 3:
$y = $x * 3;
break;
case 4:
$y = $x * 4;
break;
case 5:
$y = $x * 5;
break;
case 6:
$y = $x * 6;
break;
case 7:
$y = $x * 7;
break;
case 8:
$y = $x * 8;
break;
case 9:
$y = $x * 9;
break;
default:
$y = $x * 10;
}
}
print("switch: " . (time() - $s) . "sec\n");

通过1000000000次的循环并在每个判断条件中都加入了运算操作后,我们发现结果是switch的效率更高,运行速度更快,在我的电脑上的结果是:


// if: 301sec
// switch: 255sec

虽然switch的效率更高一些,但也有需要注意的地方,首先,判断值只能是数字、浮点数或者是字符串。其次,每个判断都是普通的==判断,也就是说,下面的判断结果并不一定是你相像的结果:


$string = "2string"; switch ($string) {
case 1:
echo "this is 1";
break;
case 2:
echo "this is 2";
break;
case '2string':
echo "this is a string";
break;
} // this is 2

没错,依然是==比较时的类型强转问题,string和int值比较时强转为了int类型,"2string"强转的结果正是2。因此,在使用switch的时候,应该保证比较值和每个case的类型一致,否则就可能出现不可预计的错误。

参考代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/201911/source/PHP%E7%9A%84switch%E5%92%8Cifelse%E8%B0%81%E6%9B%B4%E5%BF%AB%EF%BC%9F.php

参考手册:https://www.php.net/manual/zh/control-structures.switch.php

关注公众号:【硬核项目经理】获取最新文章

添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料

知乎、公众号、抖音、头条搜索【硬核项目经理】

B站ID:482780532

PHP的switch和ifelse谁更快?的更多相关文章

  1. 比NGINX更快:nginx-1.15.5 vs mongols-1.2.3

    nginx是多进程web服务器的优秀代表. 本文要用mongols-1.2.3实现一个比nginx更快的多进程的web服务器. mongols是C++ 服务器基础设施库, 它的主要特性如下: tcp ...

  2. 正则表达式匹配可以更快更简单 (but is slow in Java, Perl, PHP, Python, Ruby, ...)

    source: https://swtch.com/~rsc/regexp/regexp1.html translated by trav, travmymail@gmail.com 引言 下图是两种 ...

  3. Five things that make Go fast-渣渣翻译-让GO语言更快的5个原因

    原文地址:https://dave.cheney.net/2014/06/07/five-things-that-make-go-fast 翻译放在每个小段下面 Anthony Starks has ...

  4. php中switch与ifelse的效率分析

    1.当被判断的值是常量(固定不变的值)时,switch的运行效率比ifelse的运行效率高: $jiejie=3;   // 变判断的值为常量 switch($jiejie){   case 1:   ...

  5. 精通Web Analytics 2.0 (9) 第七章:失败更快:爆发测试与实验的能量

    精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第七章:失败更快:爆发测试与实验的能量 欢迎来到实验和测试这个棒极了的世界! 如果Web拥有一个超越所有其他渠道的巨大优势,它就 ...

  6. 假如 UNION ALL 里面的子句 有 JOIN ,那个执行更快呢

    比如: select id, name from table1 where name = 'x' union all select id, name from table2 where name =  ...

  7. 【译】更快的方式实现PHP数组去重

    原文:Faster Alternative to PHP’s Array Unique Function 概述 使用PHP的array_unique()函数允许你传递一个数组,然后移除重复的值,返回一 ...

  8. ubuntu 12.04 LTS 如何使用更快的更新源

    装好ubuntu系统后的第一见事就是替换自带的更新源,原因是系统自带的源有些在中国访问不了,可以访问的速度又特别慢.幸好国内的一些公司和大学提供了速度不错的更新源.下面介绍如何使用更快的更新源 方法/ ...

  9. php提供更快的文件下载

    在微博上偶然看到一篇介绍php更快下载文件的方法,其实就是利用web服务器的xsendfile特性,鸟哥的博客中只说了apache的实现方式,我找到了介绍nginx实现方式的文章,整理一下! let' ...

随机推荐

  1. 服务器put请求获取不到参数

    问题 put请求参数映射成实体类 而参数似乎接受不到,服务器识别为null 解决 在参数前边加上RequestBody @RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请 ...

  2. Prometheus alertmanager邮件发送+grafana告警展示

    前言 前面一篇博客,我已经介绍了prometheus如何监控mysql. 这一篇我来介绍如何通过alertmanger进行告警邮件发送(微信或钉钉类似,因为需要企业帐户,我就不试了),以及如何通过gr ...

  3. 题解 big

    传送门 题面里那个式子 考场上我推了半天那个式子代表什么意思,但就是没想到位运算 \(\lfloor \frac{2x}{2x^n} \rfloor \iff x\gg(n-1)\), 即将x的第n位 ...

  4. java-将数组调整为左奇右偶

    先将偶数个数找出来 然后将奇数偶数分别保存到数组 然后写入 时间复杂度为O(n); public class test{ public static void main(String[] args){ ...

  5. docker安装maven私服

    目录 一.nexus3安装 二.创建私服仓库 三.发布jar包到私服 四.引用maven私服jar包 五.参考 一.nexus3安装 1.安装镜像 docker pull sonatype/nexus ...

  6. CentOS7 安装Oracle19c数据库RPM包安装

    我前两天发了安装oracle12c的方法,但是我虽然在虚拟机试验成功了,正式服务器安装的时候发现还是不行,安装页面卡空白,也没有解决办法,所以我就放弃了界面安装找命令行安装的办法,找了一些之后发现都比 ...

  7. Java随手记录

    Spring @Configuration注解及配置方法 转自:https://www.jb51.net/article/184822.htm Spring @Configuration注解 Spri ...

  8. 对集合使用Comparator

    1 import java.util.Comparator; 2 import java.util.PriorityQueue; 3 4 /** 5 * 对集合使用Comparator,不改变对象的自 ...

  9. Acwing 883高斯消元法的运用

    Acwing 883高斯消元法的运用 解线性方程组 Acwing 883 输入一个包含 n 个方程 n 个未知数的线性方程组. 方程组中的系数为实数. 求解这个方程组. 下图为一个包含 m 个方程 n ...

  10. promise错误处理的三种方法

    promise碰到then,也就是resolve或者reject的时候是异步的,所以try...catch对它是没有用的 1.then(resolve,reject);  then方法中第二个回调,是 ...