Как стать автором
Обновить

А так ли нужен static?

Время на прочтение3 мин
Количество просмотров20K
Довольно часто в последнее время читал разные статьи на тему оптимизации, во многих из них писалось о том, что если функция используется как статическая, то с точки зрения оптимизации лучше перед ее объявлением написать модификатор static.

Интересно, подумал я, а какой реальный прирост производительности можно получить, добавив 6 символов к объявлению функции.

Итак, исходная конфигурация
Сервер: 2 x Intel Pentium D CPU 3.00GHz (хотя второй процессор мало чем был нужен)
PHP: PHP 5.2.5 (cli) (built: Apr 9 2008 06:17:23)

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

Прошу прощения, но так и не удалось победить редактор, на корректное воспроизведение знака меньше, вместо него скобочка.

class Math
{
  function fac($v)
  {
    return ($v==0 || $v==1)?1:($v*Math::fac($v-1));
  }
  static function sfac($v)
  {
    return ($v==0 || $v==1)?1:($v*Math::sfac($v-1));
  }
}
function gettime()
{
  $arr=explode(' ',microtime());
  return $arr[1]+$arr[0];
}
for($i=1;$i[=100;++$i)
{
  echo $i."\t";
  $v=gettime();
  for($j=0;$j[$i;++$j)
    Math::fac(30);
  echo ((gettime()-$v)/$i*1000000)."\t";

  $v=gettime();
  for($j=0;$j[$i;++$j)
    Math::sfac(30);
  echo ((gettime()-$v)/$i*1000000)."\n";
}

Результаты

Среднее время работы функции объявленной без модификатора static — 64.518451690674 микросекунды.
Среднее время работы функции объявленной с модификатором static — 31.158924102783 микросекунды

Далее хотелось выбрать какие-нибудь сложные вычисления. Я взял вычисление 30 члена последовательности Фибоначчи. Достаточно глубокая рекурсия. Пример теста (не обращать внимание на идиотский таймер)

class Math
{
  function fib($v)
  {
    return ($v==0 || $v==1)?1:(Math::fib($v-1)+Math::fib($v-2));
  }
  static function sfib($v)
  {
    return ($v==0 || $v==1)?1:(Math::sfib($v-1)+Math::sfib($v-2));
  }
}
for($i=1;$i[=100;++$i)
{
  echo $i."\t";
  $v=gettime();
  for($j=0;$j[$i;++$j)
  Math::fib(30);
  echo ((gettime()-$v)/$i)."\t";

  $v=gettime();
  for($j=0;$j[$i;++$j)
    Math::sfib(30);
  echo ((gettime()-$v)/$i)."\n";
}

100 вычислений были взяты, чтобы посмотреть более точно определить среднее значение

Результаты

Среднее время работы функции объявленной без модификатора static — 5,5365417218208 секунды.
Среднее время работы функции объявленной с модификатором static — 2,6412206792831 секунды

Какой можно сделать вывод, кроме того, что я потратил 11 часов процессорного времени :-).
При достаточно частом вызове функций, особенно в рекурсивных вычислениях, добавление модификатора static существенно увеличит производительность.
Однако, если это простая функция, которая вызывается всего лишь один раз, прирост производительности будет незначительным.

update:Многие могут спросить зачем делать последовательно сначала 1 запуск, потом 2 запуска, ..., потом 100 запусков. Можно было сразу запустить 100 итераций. Да можно, однако я параллельно исследовал другие вещи, которые не имеют никакого отношения к static
Теги:
Хабы:
Всего голосов 14: ↑10 и ↓4+6
Комментарии48

Публикации

Истории

Работа

PHP программист
148 вакансий

Ближайшие события