Подтвердить что ты не робот

Какова стоимость исполнения "включить" в PHP?

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

Будет ли кэширование APC сделать эту стоимость пренебрежимо малой?

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

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

Стоимость самой функции весьма незначительна. 100 файлов (с пустыми файлами) стоит около 5 мс; и не более одной микросекунды при использовании opcache.

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

Реальная стоимость зависит от размера ваших файлов и того, что PHP должен анализировать и/или компилировать. Для лучшего представления о том, каковы эти затраты, приведены результаты тестов, которые я провел на Mac Mac Server 2010 года с диском 10 000 RPM с запуском PHP 5.3 с оптимизатором opcache с поддержкой 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

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

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

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

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

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

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

Ответ 3

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

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

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

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