对比代码先行贴上,有疑问或者有不同见解的希望可以提出,大家共同进步:

//-------------------------------------
$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循环速度对比的更多相关文章

  1. 【PHP】 foreach循环中变量引用的一道面试题

    $a = array('a','b','c'); foreach($a as &$v){} foreach($a as $v){ } var_dump($a); 现在.不要打开浏览器,猜测一下 ...

  2. PHP中的&传值引用的问题,在foreach循环的结果能帮解释下输出的结果原理是什么?

    PHP中的&传值引用的问题,在foreach循环的结果能帮解释下输出的结果原理是什么? 代码如下: <?php $arr = array('one','two','three'); fo ...

  3. 为什么阿里巴巴禁止在 foreach 循环里进行元素的 remove/add 操作--java.util.ConcurrentModificationException

    摘要 foreach循环(Foreach loop)是计算机编程语言中的一种控制流程语句,通常用来循环遍历数组或集合中的元素. 在阿里巴巴Java开发手册中,有这样一条规定: 但是手册中并没有给出具体 ...

  4. for循环和foreach循环遍历集合的效率比较

    先上代码 package com.test; import java.util.ArrayList; import java.util.LinkedList; import java.util.Lis ...

  5. 为什么禁止在 foreach 循环里进行元素的 remove/add 操作

    首先看下边一个例子,展示了正确的做法和错误的错发: 这是为什么呢,具体原因下面进行详细说明: 1.foreach循环(Foreach loop)是计算机编程语言中的一种控制流程语句,通常用来循环遍历数 ...

  6. Java for循环和foreach循环的性能比较

    就是有些人循环用的是普通for循环,有些人用的是foreach循环,它们之间有什么区别?应该在什么时候使用这两种循环了? 两种循环的语法格式: 普通for循环语法: for (int i = 0; i ...

  7. 有关集合的foreach循环里的add/remove

    转自:Hollis(微信号:hollischuang) 在阿里巴巴Java开发手册中,有这样一条规定: 但是手册中并没有给出具体原因,本文就来深入分析一下该规定背后的思考. 1 .foreach循环 ...

  8. JavaScript数组forEach循环

    JavaScript数组forEach循环 今天写JavaScript代码把forEach循环数组忘记写法了,在此记录一下以防止未来忘记. let a = [1, 2, 3]; a.forEach(f ...

  9. C# Foreach循环本质与枚举器

    对于C#里面的Foreach学过 语言的人都知道怎么用,但是其原理相信很多人和我一样都没有去深究.刚回顾泛型讲到枚举器让我联想到了Foreach的实现,所以进行一番探究,有什么不对或者错误的地方大家多 ...

随机推荐

  1. [Big Data - Kafka] Kafka设计解析(二):Kafka High Availability (上)

    Kafka在0.8以前的版本中,并不提供High Availablity机制,一旦一个或多个Broker宕机,则宕机期间其上所有Partition都无法继续提供服务.若该Broker永远不能再恢复,亦 ...

  2. Total Command 常用快捷键

    压缩和解压缩文件Alt + F5 压缩选定文件                                       Alt + F9      解压压缩文件Alt + Shift + F9   ...

  3. (1) Mysql高性能优化规范建议

    数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意 ...

  4. Linux配置简单采集

    #!/bin/bash #CPU逻辑个数 cpu_processor=$(cat /proc/cpuinfo | grep processor | wc -l) #CPU物理个数 cpu_num=$( ...

  5. 【iCore1S 双核心板_ARM】例程十:SYSTICK定时器实验——定时点亮LED

    实验原理: 通过STM32的三个GPIO口驱动三色LED的三个通道,设定GPIO为推挽输出,采用 灌电流的方式与LED连接,输出高电平LED灭,输出低电平LED亮,通过系统定时器实现 1s定时,每秒变 ...

  6. 学习MongoDB(Troubleshoot Replica Sets) 集群排除故障

    Test Connections Between all Members(集群中节点网络测试) 在进行Mongodb集群时,每个节点的网络都需要互动,假设有3个服务器节点. m1.example.ne ...

  7. InstrumentDriver,对iOS自动化测试说 Yes!

    InstrumentDriver 是 Mobile自动化小组最近实现的基于 instrument,针对 iOS 的自动化测试框架,目前支持 java 语言编写测试用例. 研究过iOS自动化测试的同学肯 ...

  8. Java知多少(39)interface接口

    在抽象类中,可以包含一个或多个抽象方法:但在接口(interface)中,所有的方法必须都是抽象的,不能有方法体,它比抽象类更加“抽象”. 接口使用 interface 关键字来声明,可以看做是一种特 ...

  9. RMAN正确地删除Archivelog以及设置有备库的归档删除策略

    原文链接:http://blog.sina.com.cn/s/blog_64e166580100xks5.html 如何正确地删除Archivelog: Archivelog并不能直接得从OS层直接物 ...

  10. vue返回上一页面如果没有上一页面返回首页

    methods: { back(){ if (window.history.length <= 1) { this.$router.push({path:'/'}) return false } ...