php测试for/while/foreach循环速度对比
对比代码先行贴上,有疑问或者有不同见解的希望可以提出,大家共同进步:
//-------------------------------------
$k=0;
$checkTime = ['for'=>0,'while'=>0,'foreach'=>0];
while($k<200){
$arr = range(0,1000000);
$countArr=count($arr);
$begintime = microtime();
for($i=0;$i<$countArr;$i++){
}
$endtime = microtime();
$forTime = ($endtime - $begintime); $begintime = microtime();
$i=0;
while ($i<$countArr){
$i++;
}
$endtime = microtime();
$whileTime = ($endtime-$begintime);
$begintime = microtime();
foreach($arr AS $key=>$val){ }
$endtime = microtime();
$foreachTime= ($endtime-$begintime);
echo 'fortime:'.$forTime.'----whiletime:'.$whileTime.'------foreachtime'.$foreachTime;
$getMinArr = [$forTime,$whileTime,$foreachTime];
$mintime = min($getMinArr);
echo '<br />';
switch($mintime){
case $forTime:
echo 'forTime最慢,运行时间为:'.$mintime;
$checkTime['for']++;
break;
case $whileTime:
echo 'while最慢,运行时间为:'.$mintime;
$checkTime['while']++;
break;
case $foreachTime:
echo 'foreachTime最慢,运行时间为:'.$mintime;
$checkTime['foreach']++;
break;
}
echo '<hr />';
$k++;
}
echo '总结数据:-for最快速度次数:'.$checkTime['for'].';-while最快速度次数:'.$checkTime['while'].';foreach最快速度次数:'.$checkTime['foreach'];
//--------------------------- 说明:创建100万个数组,然后用三个循环来进行对比,最后用毫秒级别时间戳来进行时间差计算。 测试结果部分数据: //----------------
fortime:0.013788----whiletime:0.01336------foreachtime0.021404
while最快,运行时间为:0.01336
fortime:0.013393----whiletime:0.01358------foreachtime0.021356
forTime最快,运行时间为:0.013393
fortime:0.013536----whiletime:0.013592------foreachtime0.022041
forTime最快,运行时间为:0.013536
fortime:0.013753----whiletime:0.014442------foreachtime0.021168
forTime最快,运行时间为:0.013753
fortime:0.013404----whiletime:0.013742------foreachtime0.021407
forTime最快,运行时间为:0.013404
总结数据:-for最快速度次数:88;-while最快速度次数:108;foreach最快速度次数:4
//-----------------
注意:上面我for循环的时候count语句是放在for循环外计算的,很多网上资料都说foreach循环比for快,但是我看了他们的实例,并且运行了他们的实例,实际上问题就是出在for的count放循环中比较
因为使用for的时候,如果count放在里面的话,每次循环都会统计一次,接下来我稍微修改下代码,以所谓foreach比for快的方式,大家对比一下就明白了。 //---------------------
$k=0;
$checkTime = ['for'=>0,'while'=>0,'foreach'=>0];
while($k<200){
$arr = range(0,1000000);
$countArr=count($arr);
$begintime = microtime();
for($i=0;$i<count($arr);$i++){
}
$endtime = microtime();
$forTime = ($endtime - $begintime); $begintime = microtime();
foreach($arr AS $key=>$val){ }
$endtime = microtime();
$foreachTime= ($endtime-$begintime);
echo 'fortime:'.$forTime.'----------foreachtime'.$foreachTime;
$getMinArr = [$forTime,$foreachTime];
$mintime = min($getMinArr);
echo '<br />';
switch($mintime){
case $forTime:
echo 'forTime最慢,运行时间为:'.$mintime;
$checkTime['for']++;
break;
case $foreachTime:
echo 'foreachTime最慢,运行时间为:'.$mintime;
$checkTime['foreach']++;
break;
}
echo '<hr />';
$k++;
}
echo '总结数据:-for最快速度次数:'.$checkTime['for'].';foreach最快速度次数:'.$checkTime['foreach'];
//------------------------
得出数据结果:

这个实例我把count放在for循环里面,所以在速度方面,直线下降了。
所以从这些数据看来,只要你把count放在for外面,在速度方面还是优于foreach的,只是for有很大局限性的,就是对数组结构有要求的,有其他间接的
可以提出来。
php测试for/while/foreach循环速度对比的更多相关文章
- 【PHP】 foreach循环中变量引用的一道面试题
$a = array('a','b','c'); foreach($a as &$v){} foreach($a as $v){ } var_dump($a); 现在.不要打开浏览器,猜测一下 ...
- PHP中的&传值引用的问题,在foreach循环的结果能帮解释下输出的结果原理是什么?
PHP中的&传值引用的问题,在foreach循环的结果能帮解释下输出的结果原理是什么? 代码如下: <?php $arr = array('one','two','three'); fo ...
- 为什么阿里巴巴禁止在 foreach 循环里进行元素的 remove/add 操作--java.util.ConcurrentModificationException
摘要 foreach循环(Foreach loop)是计算机编程语言中的一种控制流程语句,通常用来循环遍历数组或集合中的元素. 在阿里巴巴Java开发手册中,有这样一条规定: 但是手册中并没有给出具体 ...
- for循环和foreach循环遍历集合的效率比较
先上代码 package com.test; import java.util.ArrayList; import java.util.LinkedList; import java.util.Lis ...
- 为什么禁止在 foreach 循环里进行元素的 remove/add 操作
首先看下边一个例子,展示了正确的做法和错误的错发: 这是为什么呢,具体原因下面进行详细说明: 1.foreach循环(Foreach loop)是计算机编程语言中的一种控制流程语句,通常用来循环遍历数 ...
- Java for循环和foreach循环的性能比较
就是有些人循环用的是普通for循环,有些人用的是foreach循环,它们之间有什么区别?应该在什么时候使用这两种循环了? 两种循环的语法格式: 普通for循环语法: for (int i = 0; i ...
- 有关集合的foreach循环里的add/remove
转自:Hollis(微信号:hollischuang) 在阿里巴巴Java开发手册中,有这样一条规定: 但是手册中并没有给出具体原因,本文就来深入分析一下该规定背后的思考. 1 .foreach循环 ...
- JavaScript数组forEach循环
JavaScript数组forEach循环 今天写JavaScript代码把forEach循环数组忘记写法了,在此记录一下以防止未来忘记. let a = [1, 2, 3]; a.forEach(f ...
- C# Foreach循环本质与枚举器
对于C#里面的Foreach学过 语言的人都知道怎么用,但是其原理相信很多人和我一样都没有去深究.刚回顾泛型讲到枚举器让我联想到了Foreach的实现,所以进行一番探究,有什么不对或者错误的地方大家多 ...
随机推荐
- 物联网架构成长之路(11)-Redis缓存主从复制
1. 说明 在我的物联网平台框架框架中,会用到Redis这个中间件.作为EMQ权限认证的缓存.https://www.cnblogs.com/think-in-java/p/5123884.html ...
- 【emWin】例程三十一:窗口对象——Multipage
简介: ULTIPAGE 类似于笔记本中的分隔卡或文件柜中的标签.通过使用MULTIPAGE 小工具,应用程序可为窗口或对话框的相同区域定义多个页面.每个页面包含特定 类型的信息或用户选择相应页面时应 ...
- CentOs 6.x 升级 Python 版本【转】
在CentOS 6.X 上面安装 Python 2.7.X CentOS 6.X 自带的python版本是 2.6 , 由于工作需要,很多时候需要2.7版本.所以需要进行版本升级.由于一些系统工具和服 ...
- 教你一招:win10下JDK的安装与环境变量配置
1.到官网下载最新版本的JDK http://www.oracle.com/technetwork/java/javase/downloads/index.html 2.安装JDK,同安装其他软件一样 ...
- 公众平台返回原始数据为: 错误代码-40164,错误信息-invalid ip, not in whitelist hint
1.登录公众平台,进入开发->基本配置页面 2.点击配置进入IP白名单设置页 3.填写微客助理IP地址:183.63.25.68 4.管理员扫码确认保存 5.设置成功后点击“关闭” 6.修改成功 ...
- [JS] ECMAScript 6 - Object : compare with c#
Ref: 对象的扩展 Outline: 属性的简洁表示法 属性名表达式 方法的 name 属性 Object.is() Object.assign() 属性的可枚举性和遍历 Object.getOwn ...
- elastaicsearch基础----->elastaicsearch的使用(一)
这里面我们总结一下es的一些基础使用. es的基础用法 一.es索引的创建 在postman中,请求url地址:192.168.1.112:9200/user.请求方式:PUT.请求内容如下: { & ...
- Mybatis 的 xml 文件语法错误,启动项目时控制台一直循环解析但是不打印错误
重写SqlSessionFactoryBean的buildSqlSessionFactory方法: eg: package com.slp; import java.io.IOException; i ...
- 【CF573D】Bear and Cavalry 线段树
[CF573D]Bear and Cavalry 题意:有n个人和n匹马,第i个人对应第i匹马.第i个人能力值ai,第i匹马能力值bi,第i个人骑第j匹马的总能力值为ai*bj,整个军队的总能力值为$ ...
- css---颜色过渡渐变
CSS---颜色过渡渐变 <!doctype html> <html lang="en"> <head> <meta charset=&q ...