for与foreach哪个更快?

for与foreach哪个性能更好一些?还是处理不同的数据有各自的优点?希望大神给解答一下.

阅读 9.7k
4 个回答

ArrayList这样的可使用下标进行随机访问的数据结构,使用下标访问,要比foreach的方式进行顺序访问,速度要快一些。foreach这样写法,使用的过程产生一个额外的对象Enumerator,而且每次访问需要更多的操作,降低性能。

foreach是通过GetEnumerator获得一个IEnumerator对象,通过IEnumerator对象执行MoveNext()方法和获取Current属性进行遍历的。

由于Enumerator中,做了版本检查处理的工作,所以使用foreach线程安全

所以for的效率通常来说是高于foreach的,但话也不能说是绝对。

那么如何选择呢?我的建议是,在一些全局的,多线程可以访问的数据结构对象,使用foreach。而对本地变量,则使用for,效率和安全兼顾!


更新:刚刚查了下资料,发现对于10W级以上的数组,foreach效率会更高,但对于1W级的数组,还是for效率高。
http://blog.csdn.net/w2cschoo...

foreach
特别是php7 修改了array的数据结构后 foreach更快了

遍历数组还是用foreach吧,毕竟不用先统计数组。

这类问题,应该StackOverflow上也有了:Performance of FOR vs FOREACH in PHP
得票最高的作者说:“他几乎很少用for”,不过这两者的区别在大多数情况下都是很小的。

My personal opinion is to use what makes sense in the context. Personally I almost never use for for array traversal. I use it for other types of iteration, but foreach is just too easy... The time difference is going to be minimal in most cases.

他提到这个循环(比较差的写法):

for ($i = 0; $i < count($array); $i++) {

是一个很昂贵的循环,因为每次都要调用count(感觉这种写法大家都是避免的)
他还贴了一个对比测试:for foreach foreach中用引用

$a = array();
for ($i = 0; $i < 10000; $i++) {
    $a[] = $i;
}

$start = microtime(true);
foreach ($a as $k => $v) {
    $a[$k] = $v + 1;
}
echo "Completed in ", microtime(true) - $start, " Seconds\n";

$start = microtime(true);
foreach ($a as $k => &$v) {
    $v = $v + 1;
}
echo "Completed in ", microtime(true) - $start, " Seconds\n";

$start = microtime(true);
foreach ($a as $k => $v) {}
echo "Completed in ", microtime(true) - $start, " Seconds\n";

$start = microtime(true);
foreach ($a as $k => &$v) {}    
echo "Completed in ", microtime(true) - $start, " Seconds\n";

And the results:

Completed in 0.0073502063751221 Seconds
Completed in 0.0019769668579102 Seconds
Completed in 0.0011849403381348 Seconds
Completed in 0.00111985206604 Seconds
So if you're modifying the array in the loop, it's several times faster to use references...
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题