• Сценарии Perl
Модуль Apache, позволяющий выполнять сценарии Perl без вызова интерпретатора Perl
• PHP
Для сравнения те же сценарии программировались на РНР и выполнялись
После нескольких оценок производительности, включающих различные типы сценариев и загрузки серверов, был сделан вывод, что mod_perl, FastCGi и РНР дают самые быстрые результаты, мало различаясь между собой. Таким образом, если сайт или сценарий РНР работают медленно, то надо анализировать код, а не менять язык.
Тесты
Тест 1 — 1000 выполнений очень короткого сценария (табл. 24.1):
Оптимизация кода РНР
Говоря о задачах предварительной оптимизации (preoptimization), программисты рассуждают так: «Я заменю этот вектор хеш-таблицей и повышу скорость» или «Я заменю эту функцию ereg() несколькими функциями str rep- 1асе(), это, повысит скорость». Они весьма заблуждаются.
Во-первых, при такого рода оптимизации время выполнения сценария обычно сокращается не более чем на секунды, а потому польза невелика, зато легкость чтения кода может значительно пострадать. Во-вторых, предварительная оптимизация очень часто является непроизводительной тратой драгоценного времени программиста.
Оптимизацией стоит заниматься, только убедившись в действительной ее необходимости. Профессиональным подходом к повышению производительности будет следующий:
♦ Профилировать код и найти узкие места
♦ Классифицировать узкие места
♦ Ликвидировать узкие оптимизировав код
Профилирование кода
Если скорость выполнения кода неудовлетворительна, то первым делом необходимо его профилировать и измерить время, которое сценарий тратит на выполнение различных задач и функций. На основе этой информации можно выяснить, на что сценарий расходует больше всего времени. Эти функции называются узкими местами (bottlenecks).
Профилирование может преподнести сюрпризы. Например, может оказаться, что 99% времени сценарий тратит на запросы к базе данных, либо выявятся другие узкие места, такие как дисковый ввод/вывод при чтении больших файлов или журналов. Оптимизация не может быть эффективной без предварительного профилирования.
Как профилировать сценарии РНР
Для того чтобы профилировать сценарий РНР, надо снабдить таймерами некоторые функции и задачи сценария и измерить продолжительность их выполнения.
Допустим, есть такой сценарий РНР:
<?php
// Some initializations requi re_once("some_class.php");
$foc = new some_class();
$resl = $fob->do_a_method(); $res2 = $foo->do_a_method2();