О производительности в PHP
May 15th, 2007 by Yuriy DrozdovДавно пользуюсь темплитным движком Smarty, поэтому echo не использую. Но обстоятельства сложились таким образом, что надо было быстро набросать код и показать его работоспособность заказчику. В скрипте был следующий кусок кода:
foreach ($a_servers as $val)
{
echo ‘Что-то выводилось’;
//далее выполнялись какие-то действия
echo ‘Потом снова был вывод’;
}
{
echo ‘Что-то выводилось’;
//далее выполнялись какие-то действия
echo ‘Потом снова был вывод’;
}
Массив $a_servers оказался большим (больше 2000 элементов) и скрипт выполнялся долго.
Заменил код на следующий:
$message = ”;
foreach ($a_servers as $val)
{
$message .= ‘Что-то выводилось’;
//далее выполнялись какие-то действия
$message .= ‘Потом снова был вывод’;
}
echo $message;
foreach ($a_servers as $val)
{
$message .= ‘Что-то выводилось’;
//далее выполнялись какие-то действия
$message .= ‘Потом снова был вывод’;
}
echo $message;
Время выполнения скрипта уменьшилось на 2 секунды!
Вывод: если вы знаете как повысить производительность, не ленитесь и всегда делайте это.
Эм… А что понимается под “выполнялся долго”. Потому что если он выполнялся, скажем, пол минуты, то 2 сек выигрыш вполне может быть погрешностью.
Замеры производил согласно manual
function getmicrotime()
{
list($usec, $sec) = explode(” “, microtime());
return ((float)$usec + (float)$sec);
}
$time_start = getmicrotime();
for ($i=0; $i < 1000; $i++) {
// Ничего не делать. Повторить 1000 раз
}
$time_end = getmicrotime();
$time = $time_end - $time_start;
Погрешности быть не должно. Скрипт выполнялся порядка 20 с. Плюс во всех советах по оптимизации кода советуют заменять множество выводов одним.
В аналогичном случае (в скрипте несколько “echo”) я делал так:
ob_start();
// тут много чужого кода
// в нём там и сям есть echo()
$output = ob_get_contents();
ob_end_clean();
echo $outout;
Насчёт производительности не скажу (подозреваю, что оно аналогично твоему случаю), но в случае, когда нужно подключить к сайту чужой скрипт — неплохое решение.
согласен, решение интересное
Еще можно foreach() заменить на for().
можно. только сильного выигрыша в производительности, я думаю, не получим
вот так получилось:
for - 0.0037438869476318
foreach - 0.001884086227417