Какова стоимость производительности «включить» в PHP? - PullRequest
20 голосов
/ 03 февраля 2011

Просто интересно, есть ли у кого-нибудь информация о том, с какими «затратами» связано включение в него БОЛЬШОГО (600 КБ или более) php-файла, содержащего сотни файлов классов. Действительно ли это имеет большое значение по сравнению с автозагрузкой отдельных файлов, которые, например, выполняют поиск в нескольких каталогах, прежде чем найти совпадение?

Кэширование APC сделает эту стоимость незначительной?

Ответы [ 3 ]

21 голосов
/ 03 февраля 2011

Как правило, стоимость включения одного большого файла зависит от вашего варианта использования.Допустим, у вас есть большой файл с 200 классами.

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

Есливы используете все 200 классов, в том числе большой файл будет значительно дешевле, чем 200 небольших файлов.

Место обрезания зависит от системы.Я бы предположил, что это будет где-то около 50% отметки (где, если вы используете менее 100 классов в одном запросе, автозагрузка).

А использование APC, скорее всего, сместит точку безубыточности ближе к меньшемуклассы (так что без них, 100 используемых классов могут быть точкой безубыточности, но при этом может быть использовано 50 классов), поскольку это делает большой сингл гораздо более дешевым, но лишь немного снижает накладные расходы каждого отдельного включения.

Точные точки безубыточности будут зависеть от системы на 100% (как быстро ваш дисковый ввод-вывод, как быстро ваши процессоры, сколько памяти и т. Д.).Таким образом, единственный способ узнать наверняка на вашей платформе - это проверить.

Однако на карту поставлено больше, чем просто производительность.С одним большим файлом может пострадать удобство обслуживания, поскольку одновременно работать с несколькими классами сложнее (вкладки в IDE становятся бесполезными).Лично я бы держал все классы в отдельных файлах и упростил бы мне жизнь разработчика, а не создавал бы одно гигантское чудовище файла.

Теперь, если у вас есть уровни трафика Facebook, возможно, стоит продолжить исследование.Но если это не так, я лично не буду беспокоиться об этом ...

14 голосов
/ 16 марта 2015

Я провел несколько тестов на различные цены php include(), которые я хотел бы поделиться, так как я вижу, что многие программисты или платформы CMS упускают из виду эти php-затраты перед началом работы.Стоимость самой функции весьма незначительна.100 файлов включает (с пустыми файлами) стоимость около 5 мс;и не более одной микросекунды при использовании opcache.

Таким образом, экономия затрат на включение большего файла php, содержащего 100 классов, в отличие от 100 отдельных файлов, составляет всего около 5 мс.А использование кэша OpCode делает эти затраты неуместными.

Реальная стоимость зависит от размера ваших файлов и от того, что PHP должен анализировать и / или компилировать.Чтобы лучше понять, каковы эти затраты, вот результаты тестирования, которые я провел на Mac Mini Server 2010 с диском 10000 об / мин, с PHP 5.3 с оптимизированным кэшем eAccelerator.

1µs  for 100 EMPTY File includes, w/opcache
5ms  for 100 EMPTY File includes, no opcache

7ms   for 100 32KB File includes, w/opcache
30ms  for 100 32KB File includes, no opcache

14ms  for 100 64KB File includes, w/opcache
60ms  for 100 64KB File includes, no opcache

22ms  for 100 128KB File includes, w/opcache
100ms for 100 128KB File includes, no opcache

38ms  for 100 200KB File includes, w/opcache
170ms for 100 200KB File includes, no opcache

php-файл размером 600 КБ примерно стоит 6 мс или около 1 мс при использовании кэша кода операции.Вместо этого вы действительно хотите посмотреть размер всего кода, включенного в запрос.

Объединение файлов в комбинации для попытки сэкономить ресурсы - определенно не очень хорошая идея и будет ошибкой при использовании операционного кэша.Мой тест совсем не учитывает скорость диска, так как я включал один и тот же файл 100 раз.Тем не менее, я не чувствую необходимости покрывать дисковый ввод-вывод вообще, потому что наличие операционного кэша действительно является обязательным условием с точки зрения базовой производительности.

Чтобы максимально повысить производительность и сохранитьИспользование оперативной памяти, нужно сделать наоборот.То есть максимально разделить файлы по контексту, используя автозагрузчик или шаблон фабрики классов, чтобы включить как можно меньше неиспользуемого кода для каждого запроса.

С этой целью неправильное использование include_once() также может иметь негативные последствия для производительности ...

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

Среднееполные подробности столбца таблицы, составляющей примерно 20-50 КБ для массивов схемы.Включение 10-15 из них в любой заданный запрос обходится в 1-3 мс для массивов.Что само по себе не так много.Но это становится целесообразным в сочетании с экономией ОЗУ 500 КБ на запрос.

1 голос
/ 03 февраля 2011

APC сильно спасет вас, но я не знаю, будет ли это незначительным, если ваш источник 600k. Это около 15000 строк кода? Не очень много для веб-сайта, но довольно большое для одного файла.

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

Особенно, когда вы используете APC, этот подход будет лучше, потому что у вас нет накладных расходов на файловый ввод / вывод, которые будут у вас при загрузке множества маленьких файлов с диска. Я бы предпочел реализовать небольшие, указанные классы и поместить каждый из них в отдельный файл. Вы можете использовать механизм загрузки классов PHP (__autoload) для автоматической загрузки нужных модулей.

Когда вы придумаете хорошее соглашение об именах для ваших классов и юнитов, это значительно облегчит вашу разработку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...