为什么计数比$ count差

问题描述

| 我只是在查看不同问题的答案以了解更多信息。我看到一个回答,说写在PHP中是不好的做法 for($ i = 0; $ i <计数($ array); $ i ++) 它说在循环中调用count函数会降低代码的速度。评论中对这个问题的讨论不清楚。我想知道为什么这不是好习惯。替代方法应该是什么?     

解决方法

您应该改为:
$count = count($array);
for($i=0;$i<$count;$i++)...
这样做的原因是因为如果将ѭ1放入for循环中,则每次迭代都必须调用count函数,这会降低速度。 但是,如果将计数放入变量中,则它是一个静态数字,不必每次都重新计算。     ,对于每次迭代,PHP都会检查循环的那一部分(条件)以查看是否应该继续循环,并且每次检查时,它都在计算数组的长度。 缓存该值的一种简单方法是...
for($i=0,$count=count($array);$i<$count;$i++) { ... }
在小循环中可能不是必需的,但是在迭代数千个项目时可能会产生巨大的变化,并且取决于条件中的函数调用(以及如何确定其返回值)。 这也是为什么您应该使用
foreach() { ... }
的原因,它在数组的副本上使用迭代器来遍历集合,而您不必担心缓存循环的条件。     ,我听说过医生手术中的一个数据库,该数据库正是通过一个软件完全犯了这个错误。已对约100条记录进行了测试,所有记录均正常。在短短几个月内,它处理了数百万条记录,并且完全无法使用,需要几分钟来加载结果。按照上面的答案替换了代码,并且效果很好。 换种方式考虑,一个功能强大的专用服务器不做其他任何事情,将需要大约1纳秒的时间来进行count($ array)。如果您有100个for循环,每个循环计数1,000行,那么那仅是0.0001秒。 但是,这是每页加载的100,000次计算。最多可扩展至1,000,000个用户(谁不想拥有100万用户?)...加载10页,现在您有1,000(1万亿)次计算。这将给服务器带来很多负担。您的处理器花费了1000秒(约16.5分钟)来运行该代码。 现在增加机器处理代码所需的时间,数组中项目的数量以及代码中for循环的数量...您实际上是在说数万亿个过程和许多小时的处理时间可以通过仅将结果首先存储在变量中来避免这种情况。     ,这不是一个好习惯,因为按照书面说明,每次循环都会调用
count($array)
。假设您不会在循环中更改数组的大小(这本身将是一个可怕的想法),则此函数将始终返回相同的值,并且重复调用它是多余的。 对于短循环,差异可能不会很明显,但是仍然最好只调用一次函数并在循环中使用计算值。