Функция PHP Optimize в цикле - PullRequest
       40

Функция PHP Optimize в цикле

0 голосов
/ 09 февраля 2010

Я микрооптимизирую эту функцию, и у меня возникла небольшая проблема, когда внутри цикла я проверяю, равно ли значение вне цикла 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 также имеет цикл для еще большего числа объектов, поэтому мне приходится вызывать отдельные функции для сохранения еще более условной логики.

Примечание: Это может выглядеть как преждевременная оптимизация, но, поверьте, для моего приложения экономия одной миллисекунды может сэкономить драгоценные секунды (возможно, около 10000 итераций, если не больше). Поэтому, пожалуйста, никаких ответов о преждевременной оптимизации является корнем всего зла и еще много чего. Это, конечно, не преждевременно.

Ответы [ 4 ]

3 голосов
/ 09 февраля 2010

Разве вы не можете просто поставить тест вне цикла?

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 голос
/ 09 февраля 2010

Я предполагаю, что условие изменяется во время цикла, в противном случае два ответа дают другие ответы.

Возможно, условие медленное, потому что вы делаете безопасное сравнение типов (===). Возможно, вы захотите ввести дополнительную переменную, которая всегда является логической и устанавливается одновременно с общим сравнением.

Но я сомневаюсь, что сравнение в 10000 раз - ваша проблема. Возможно, вам следует сосредоточиться на циклах внутри других функций, которые будут выполняться много раз.

1 голос
/ 09 февраля 2010

поэтому моя быстрая ставка

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 голос
/ 09 февраля 2010

просто сделайте две петли

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