为啥在 for 循环的条件下调用函数是不好的?
Posted
技术标签:
【中文标题】为啥在 for 循环的条件下调用函数是不好的?【英文标题】:Why is it bad to call a function in the condition of a for loop?为什么在 for 循环的条件下调用函数是不好的? 【发布时间】:2016-05-26 01:18:47 【问题描述】:我最近要求工作中的应用程序架构师审查我编写的 php
脚本,以自动化我每周在帮助台部门执行的一些任务。
在他的评论中他说
## Loops
Your loops are good, you didn't do anything bad like calling functions in the condition
for ($i=0; $i < count($array); $i++); is BAD
老实说,我以前从未想过在我的代码中这样做,但这让我想知道为什么它会很糟糕。
我认为这是因为,函数的结果可能是任何值,它似乎是创建无限循环的完美方式,并且通常会导致意外行为。
我尝试了谷歌搜索,但找不到任何相关结果,所以我问:
为什么在 for 循环的条件下调用函数不好?
注意评论本身中的count($array)
对我来说是一个给我。当然,您只想缓存它。更具体地说,我的意思是在使用其他更复杂的功能的情况下。
对于那些肯定会想“为什么不问问写它的人”的人,他非常忙,已经花时间帮助我,我不想把它推得太远“现在,你能向我解释一下你所有的 cmets 吗?”
【问题讨论】:
Cause 函数在每次循环迭代中一次又一次地调用,不是吗? 我不确定这是否偏离主题并且在 codereview 上更好。无论如何,这是因为您将在循环的每次迭代中调用该函数,并带来额外的开销。只需将 count() 结果存储在循环之外并使用变量 在我看来,避免它的唯一原因是,例如count($array) 必须在每次执行 for 时进行评估,而如果在循环之外执行显然只会评估一次。 因为它比计算一次函数结果并使用条件中的值慢。 @DamienPirsy 这个问题在代码审查中是 miles 题外话。请查看A Guide to Code Review for Stack Overflow Users。谢谢 【参考方案1】:for ($i=0; $i < count($array); $i++); //is not efficient
是的,这使用起来效率不高,因为在每次调用迭代函数时都不好。您需要执行一次此功能。
$count = count($array);
for ($i= 0; $i < $count; $i++); //is much efficient
因为在这段代码中count
函数会执行一次。在您之前的代码中count
函数执行多次。
【讨论】:
添加了 +1 但我应该更具体 您从@deed02392 得到了答复。需要更具体的吗? 不,抱歉,我只是说您的回答非常适合我最初提出的问题,后来意识到我需要更好地措辞。 ;)【参考方案2】:我能想到几个原因:
函数的返回值可能会有所不同,因此您无法确定循环是否会保持有限 某些语言不保证返回类型,因此您有另一个机会出现未定义的行为 通常性能较差(尤其是在count()
示例中)
它降低了可读性,因为开发人员现在需要查看和理解函数只是为了知道循环应该运行多少次
我想不出任何合理的例子来说明为什么每次评估条件时实际上都需要函数的返回值
迭代次数不能(容易)在运行时确定,因为必须在每次迭代结束时再次调用该函数
【讨论】:
这是我一直在寻找的答案,评论本身中的count($array)
对我来说是一个给我。我应该更具体,但我的意思是使用其他更复杂的功能
是的,我是根据您的代表得出的。我会尝试找到更多示例。
一个可能的合法示例:如果您在数组中添加一些元素。
@A.L 在许多语言中,数组是不可变的。在 PHP 中,如果您要在示例中实现代码然后附加元素,您的循环将继续运行以获取数组的新长度。但是考虑到您现在正在扩展迭代次数。想想这将是多么困难,当您必须在脑海中计算每次迭代以考虑循环是否会执行更多次时,因为迭代可能会导致更多迭代。这会大大加剧问题,所以我不认为这是一个正当的理由。【参考方案3】:
最好提前统计一下,因为如果你把它放在循环中,函数会在每次迭代时执行,检查是否满足条件。
在这个例子中,count 函数不会太重,不会减慢你的程序(除非它是一个大数组),但要注意更大的函数。
【讨论】:
是的。但其他功能则不然。 添加了 +1 但我应该更具体以上是关于为啥在 for 循环的条件下调用函数是不好的?的主要内容,如果未能解决你的问题,请参考以下文章
在循环条件下:为啥 strlen() 每次都被调用,而 vector.size() 只被调用一次? [复制]
编译器优化可以消除在 for 循环的条件中重复调用的函数吗?
java for循环 判断条件为空时 构造方法为啥不需要返回值