为什么算数比$ count差

时间:2011-04-15 14:20:29

标签: php loops for-loop

我只是在回顾不同问题的答案以了解更多信息。我看到一个answer表示写php是不好的做法

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

它表示在循环中调用count函数会降低代码的速度。关于这个问题的评论中的讨论并不清楚。我想知道为什么这不是好习惯。这样做的替代方法应该是什么?

4 个答案:

答案 0 :(得分:8)

你应该这样做:

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

这样做的原因是因为如果将count($array)置于for循环中,则必须在每次迭代时调用count函数,这会降低速度。

但是,如果将计数放入变量中,则它是一个静态数字,不必每次都重新计算。

答案 1 :(得分:4)

对于每次迭代,PHP都会检查循环的一部分( condition )以查看它是否应该保持循环,并且每次检查它时,它都会计算数组的长度。

缓存这个值的简单方法是......

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

在小循环中可能没有必要,但在迭代数千个项时可能会产生巨大的差异,并且取决于条件中的函数调用(以及它如何确定其返回值)。

这也是你应该使用foreach() { ... }的原因,如果你可以的话,它会在数组的副本上使用迭代器来循环遍历集合,你不必担心缓存循环的条件。

答案 2 :(得分:3)

我听说过医生手术中的一个数据库,用一个软件就是这个错误。它经过大约100条记录的测试,一切正常。在几个月内,它处理了数百万条记录并且完全无法使用,需要几分钟才能加载结果。根据上面的答案替换了代码,它运行得很好。

以另一种方式来思考,一个相当强大的专用服务器没有做太多其他工作需要大约1纳秒来计算($ array)。如果你有100个for循环,每个循环计数1,000行,那么只有0.0001秒。

然而,对于每个页面加载,这是100,000次计算。扩展到最多1,000,000个用户(以及谁不希望拥有100万用户?)...执行10页加载,现在您有1,000,000,000,000(1万亿)计算。这会给服务器带来很大的负担。处理器运行该代码的时间为1,000秒(约16.5分钟)。

现在增加机器处理代码所需的时间,数组中的项目数以及代码中for循环的数量......你说的是数万亿的进程和数小时的处理时间可以通过首先将结果存储在变量中来避免。

答案 3 :(得分:1)

这不是一个好习惯,因为写完后,每次循环都会调用count($array)。假设你不会在循环中改变数组的大小(这本身就是一个可怕的想法),这个函数将始终返回相同的值,并且重复调用它是多余的。

对于短循环,差异可能不会明显,但最好还是调用函数一次并在循环中使用计算值。