Я провел несколько тестов на различные цены 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 КБ на запрос.