Статьи

Процедурный PHP ведет к медленным приложениям

Прочитав ООП и «Перформанс» , Кристофер Томпсон справедливо назвал мой блеф (см. Комментарии ), вызвав дальнейшее обсуждение и заставив меня задуматься.

В «ООП и производительности» я не пытался сказать что-то абсолютное, а скорее описал общую догадку, которую я получил. Хотя я выделил два личных примера, где эффект может и был списан как деталь реализации, догадка на самом деле исходит из общих впечатлений и воспоминаний о тралении исходного кода приложений с открытым исходным кодом PHP за те годы, когда они были написаны. в основном с процедурным кодом. И это не значит, что нет никаких медлительных ОО-приложений, которые бывают на собачьих упущениях — они, безусловно, есть.

В любом случае, вместо того, чтобы продолжать, я собираюсь высунуть голову и сказать, что процедурный PHP ведет к более медленным приложениям (так что я могу его отрубить;)). Причина, по которой я чувствую себя уверенно, заключается в том, что я думаю, что у меня есть вызов, который поможет сделать вещи самоочевидными. Примечание для любого программиста на Perl / Python / любого другого — в некоторой степени это кажется специфическим для PHP, где сам скрипт не определяет отдельную область видимости переменных и где классы являются единственным чистым способом построения абстракций.

Так что здесь идет. Я собираюсь определить ввод и вывод одного скрипта, предоставляя верх и низ. Если у вас есть время / интерес, позабавьте меня и реализуйте раздел в середине, один раз без использования классов и второй раз с использованием classes / OO.

В верхней части этого скрипта мы имеем;


array(1,2),
'y'=>array(3,4),
'z'=>array(5,6),
);
}

// This variable controls how the output is rendered
// Allowed values 'html','xml', 'plain'
$output_type = 'html';

(Ваш код вводится здесь)

… тогда внизу мы имеем;


// output place in this variable
echo $result;

Конечно, есть некоторые правила и требования …

Требования

— $ dataset1 должен отображаться пользователю выше $ dataset2

— скрипт должен быть способен отображать HTML, XML и обычный текст (в формате пробела), в зависимости от значения выходной переменной

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

Правила

— вы не можете включать какие-либо внешние сценарии PHP — все должно быть в одном сценарии

— вы не можете читать или записывать какие-либо внешние файлы (в частности, вы не можете использовать шаблоны или генерацию кода)

— размещение имен функций в переменных под заголовком «hack», как и в PHP create_function ()

— ничего не должно быть выведено до окончательного утверждения: echo $ result;

— старайтесь писать как можно быстрее — не тратьте слишком много времени на размышления о решениях.

— не делайте бенчмаркинг, пока не закончите

Несмотря на правила, я думаю, что этот пример довольно типичен для типа кода, который составляет большую часть типичных приложений PHP.

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