PHP优化循环中的函数

时间:2010-02-09 11:46:18

标签: php optimization loops conditional

我是微优化这个函数并且有一个问题,在循环内部我正在检查循环外的值是否为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次迭代)。所以请不要过早优化的答案是所有邪恶和诸如此类的根源。这当然不是为时过早。

4 个答案:

答案 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倍的比较是你的问题。您可能应该关注其他函数中的循环,这些循环将被执行多次。