【问题标题】:PHP Optimize Function in LoopPHP 循环优化函数
【发布时间】:2010-02-09 11:46:18
【问题描述】:

我正在对这个函数进行微优化,并且在循环内部检查循环外部的值是否为 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 次迭代)。因此,请不要回答有关过早优化是万恶之源之类的问题。这当然不会为时过早。

【问题讨论】:

  • 虽然我觉得优化这个没有意义,phpbench.com 可能会给你一些其他的想法。

标签: php optimization loops conditional


【解决方案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);

【讨论】:

    【解决方案2】:

    只做两个循环

    if($l == 0)
      foreach(...) myfunc_clean
    else
      foreach(...) myfunc
    

    【讨论】:

      【解决方案3】:

      我假设条件在循环期间发生变化,否则其他答案提供的两个循环给出答案。

      可能条件很慢,因为您正在进行类型安全比较 (===)。您可能希望引入一个始终为布尔值并同时设置的额外变量,以便您可以使用一般比较。

      但我怀疑 10,000 倍的比较是你的问题。您可能应该关注其他函数中的循环,这些循环将被执行更多次。

      【讨论】:

      • 我只是尝试进行一百万次这些类型安全的比较:0.2 秒。使用分析器(例如 xdebug),查看真正的瓶颈在哪里......
      • @Wim,xdebug 不会逐行给出性能结果,只是逐个函数。在这里就没用了。
      • @vava 并非完全没用:您可以将一个函数拆分为多个函数(最终每行一个,但通常您不需要走那么远就能找到违规者)。有点麻烦,我知道,但通常是一种有价值的方法。
      【解决方案4】:

      所以我的快速出价是

      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) }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 2012-03-10
        • 2010-12-27
        • 1970-01-01
        • 1970-01-01
        • 2013-08-05
        • 2013-11-15
        相关资源
        最近更新 更多