2010-02-09 44 views
0

我微调优化了这个函数,并且在循环内部有点问题我在检查循环外部的值是否为0,如果是这样的话调用函数并且类似地调用函数。我将如何重构它,所以在这些循环中没有条件逻辑(这很慢)。循环中的PHP优化函数

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

虽然我发现它没有意义优化这个,但http://www.phpbench.com可能会给你一些其他的想法。 – Gordon 2010-02-09 12:02:54

回答

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

只是让两个循环

if($l == 0) 
    foreach(...) myfunc_clean 
else 
    foreach(...) myfunc 
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) } 
} 
1

我假设在循环过程中病情变化,否则两个回路其他答案提供给回答。

由于您正在进行类型安全比较(===),因此可能条件较慢。您可能需要引入一个总是布尔值的额外变量,并在同一时间进行设置,以便您可以使用常规比较。

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

+0

我只是试图做一百万次这些类型安全的比较:0.2秒。使用一个分析器(例如xdebug),看看* real *瓶颈在哪里...... – Wim 2010-02-09 11:55:48

+0

@Wim,xdebug不会给出逐行性能结果,只是按函数功能。这里没用。 – vava 2010-02-09 12:01:45

+0

@vava不完全没用:你可以把一个函数分解成多个函数(每行最后一个函数,但通常你不需要去那么远找到罪犯)。我知道有点麻烦,但通常是一种价值不错的方法。 – Wim 2010-02-09 13:06:39