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的实现,所以进行一番探究,有什么不对或者错误的地方大家多 ...
随机推荐
- flink source code
https://github.com/apache/flink/tree/master/docs https://github.com/flink-china/1.6.0 https://github ...
- Instrumentation 功能介绍(javaagent)
利用 Java 代码,即 java.lang.instrument 做动态 Instrumentation 是 Java SE 5 的新特性,它把 Java 的 instrument 功能从本地代码中 ...
- .so.x不是符号连接
去到这个目录下查看,会发现有多个.so.x文件.x是版本号的区别.将它们动态软连接在一起就可以了 参考这个博客
- (转)Windows系统白名单以及UAC机制
用户帐户控制 深入了解 Windows 7 用户帐户控制 Mark Russinovich 概览: 标准用户帐户 用户帐户控制 内容 UAC 技术 提升与恶意软件安全性 Windows 7 中的不 ...
- Linux查看文件总的数据行数,并按行拆分
先利用 wc -l BLM.txt 读出 BLM.txt 文件一共有多少行. 再 1. 以行数拆分 -l 参数: split –l 50 原始文件 拆分后文件名前缀 例:以50行对文件进行 ...
- linux php命令安装
1.添加php命令,在etc/profile文件下增加 if [ "$HISTCONTROL" = "ignorespace" ] ; then export ...
- 用Physijs在场景中添加物理效果
1.创建可用Physijs的基本Three.js场景 创建一个可用Physijs的Three.js场景非常简单,只要几个步骤即可.首先我们要包含正确的文件, 需要引入physi.js文件.实际模拟物理 ...
- Dedecms5.7搜索结果页空白无内容的解决方法
Dedecms5.7搜索结果页空白.没有内容的解决方法 许多网友在修改dedecms5.7版本的搜索功能时搜索空白的解决方法,正解如下: 系统设置—>其他选项—->是否启用文章全文检索功能 ...
- 【03月04日】A股滚动市盈率PE历史新低排名
2010年01月01日 到 2018年12月05日 之间,滚动市盈率历史新低排名. 上市三年以上的公司,2018年12月05日市盈率在300以下的公司. 1 - 青松股份(SZ300132) - 历史 ...
- gdb 脚本调试
在使用gdb调试程序的时候,有时候需要设定多个断点,重复执行某些操作,而这些操作写起来比较麻烦,这个时候就应该想起来用gdb命令脚本了,它能够很好的完成这些工作.以设置多个断点为例,我写的命令脚本为- ...