我是微优化这个函数并且有一个问题,在循环内部我正在检查循环外的值是否为0,如果这样调用函数,并且类似于它调用的函数。我将如何重构它,以便在这些循环中没有条件逻辑(这很慢)。
foreach($this->layer[$l]->objs as $obj)
{
//Horrific code to save 20ms :(
($l===0) ? $obj->myfunc_clean($var,$var2) : $obj->myfunc($var,$var2);
}
我需要摆脱条件$l===0
,因为在数千个对象循环中的这种情况会大大减慢它。此外,我有需要正常处理的函数,但另一个需要在完成时取消设置临时变量(基于l为0)。 myfunc
函数还有一个循环覆盖更多对象,因此我必须调用单独的函数来保存更多的条件逻辑。
注意:这可能看起来像过早的优化,但相信我,对于我的应用程序,节省一毫秒可以节省宝贵的秒数(如果不是更多,可能会大约10,000次迭代)。所以请不要过早优化的答案是所有邪恶和诸如此类的根源。这当然不是为时过早。
答案 0 :(得分:3)
难道你不能把测试放在循环之外吗?
if ($l === 0)
foreach($this->layer[$l]->objs as $obj)
$obj->myfunc_clean($var,$var2);
else
foreach($this->layer[$l]->objs as $obj)
$obj->myfunc($var,$var2);
答案 1 :(得分:1)
只做两个循环
if($l == 0)
foreach(...) myfunc_clean
else
foreach(...) myfunc
答案 2 :(得分:1)
所以我的快速出价是
if($l===0)
{
foreach($this->layer[$l]->objs as $obj)
{ $obj->myfunc_clean($var,$var2) }
}
else
{
foreach($this->layer[$l]->objs as $obj)
{ $obj->myfunc($var,$var2) }
}
答案 3 :(得分:1)
我假设在循环期间条件发生了变化,否则两个循环的其他答案提供了答案。
可能条件很慢,因为你正在进行类型安全比较(===)。您可能想要引入一个额外的变量,它始终是一个布尔值,并在同一时间设置,因此您可以使用常规比较。
但我怀疑10,000x倍的比较是你的问题。您可能应该关注其他函数中的循环,这些循环将被执行多次。