Bannerbank за 24 часа

Nikita Kislitsin

Xakep, номер #053, стр. 053-088-2


Замер времени выполнения программы я осуществляю при помощи следующей функции:

<?

function mt(){

$ti=explode(" ",microtime());

return ($ti[0] + $ti[1]);

}

?>

Поясню. Функция microtime() возвращает строку, состоящую из двух чисел, разделенных пробелом. Последнее показывает количество секунд, прошедших с начала "эпохи", первое, соответственно, указывает на дробную часть этой величины. Разрезая по пробелу эту строку в массив и складывая величины, получаем действительное число, которое растет параллельно прошедшему времени.

Соответственно, вычисляя этот параметр до и после некоторого блока, получаем время, за которое интерпретатор его обработал. Тестирование производилось на сервере 2xPIII 533MHz, 768Mb ECC RAM, 2x45Gb ATA100 HDD под FreeBSD 4.7 с Apache 1.3.27 и PHP 4.3.

Но довольно слов, перейдем к практическим советам по организации php-сценариев наиболее эффективным образом. К слову, ты наверняка заметил, что в пхп множество функций имеют названия-синонимы. Как я выяснил, это не совсем алиасы. Функции работают по принципиально различным алгоритмам, т.е. какая-то в определенных условиях быстрее, какая-то медленнее. Кроме того, как оказалось, запись синтаксических выражений также может оказывать существенное влияние на эффективность сценария. Все эти секреты ниже :).

Top secret

Надо сказать, что все нижеприведенные данные являются плодами моих экспериментов. Это фактический материал, спорить с которым бесполезно :). Я не претендую на какую-то объективность, т.к. условия тестирования были далеки от лабораторных, но тот, кто скажет, что ускорение работы сценария на 40% - мелочь, и можно списать это на погрешность измерений, пусть первый бросит в меня камень :). Итак, поехали.

1) Меньше символов в имени переменной - быстрее сценарий. Экономим 10%! Простой тест - цикл с тысячью итераций, дописывающий к переменной строчку из 9 символов:

Имя переменной Время работы %

$x 0.00382800 88.35%

$xxxxxxxxx 0.00384901 88.83%

$30 раз x 0.00433300 100%

Несложно заметить экономию - время выполнения алгоритма нелинейно возрастает с ростом длины имен используемых переменных. Очевидно, экономия будет намного больше, если взять пример программы, где переменных, скажем, 10, и выполняются более сложные операции. Однако и с укорачиванием имен не стоит особо усердствовать - переменные типа $a23 сильно снижают удобочитаемость кода :).

2) Вынос строковых переменных из кавычек - экономия до 40%!

Как оказалось, php медленно обрабатывает переменные, расположенные внутри кавычек. Такая вроде бы мелочь может сэкономить до 40% процессорного времени! Тест был следующий: в цикле с одной тысячью итераций к строке $b приклеивается строка $a, после чего цикл повторяется. Результаты налицо:

Конструкция Время работы %

$a.$b 0.11631400 60.39%

"$a"."$b" 0.19261100 100%

3) Использование perl-ориентированных регулярных выражений - ускорение в несколько раз.

Регулярные выражения в php существуют как в виде самостоятельных функций, так и в виде процедур, частично заимствованных у perl. Результаты тестирования показали, что последние на большинстве строк работают во много раз быстрее! Тест заключался в замене символа "!" на "*" в 3-килобайтном тексте. Результаты:

Назад на стр. 053-088-1  Содержание  Вперед на стр. 053-088-3