2010-02-09 2 views
0

Я микро-оптимизирую эту функцию и имею небольшую проблему, когда внутри цикла я проверяю, не превышает ли значение за пределами цикла 0, если это функция вызова и аналогично в функции, которую она вызывает , Как бы я реорганизовал его, чтобы в этих циклах не было условной логики (которая медленно).PHP Optimize Function in Loop

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

ответ

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

Я просто попытался сделать миллион этих сейсмических сравнений: .2 секунды. Используйте профайлер (например, xdebug), и посмотрите, где узкое место * real * ... – Wim

+0

@Wim, xdebug не даст результаты линейной производительности, просто функция по функциям. Здесь бесполезно. – vava

+0

@vava Не совсем бесполезно: вы можете разделить функцию на несколько функций (по одной для каждой строки, в конечном счете, но обычно вам не нужно заходить так далеко, чтобы найти преступника). Немного громоздко, я знаю, но, как правило, достойный подход. – Wim