"влияние на производительность" при использовании одиночного класса из 20 тыс. строк

Этот вопрос задавался здесь раньше, но ни один из ответов не пытался ответить на фактически заданный вопрос, поэтому я задаю его по-другому. Является ли загрузка одного класса из 20000 строк с сотнями функций более ресурсоемким, чем разделение кода на более мелкие классы с меньшим количеством функций в каждом и загрузка этих более мелких классов по мере необходимости?

2 ответа

Решение

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

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

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

Когда скрипт загружен, для его анализа требуется фиксированный объем памяти. Чем оно больше, тем больше памяти требуется. Затем выполняется сам скрипт, выполняющий любой код верхнего уровня (не в классе или глобальной функции). Если это включает какие-либо операторы require/include, эти скрипты загружаются (при необходимости). Если он создает объекты, это занимает больше памяти.

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

Один большой класс требует одного цикла для компиляции в двоичный код (код операции).

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

Это действительно зависит от того, сколько классов / файлов было включено во время выполнения.

Итак, решение для этого, разбить на несколько классов и использовать APC или эквивалент.

PS: потребление памяти для большого файла намного меньше, потому что PHP не нужно перекомпилировать исходный код в op-код (если вы не хотите разбивать большой класс на меньший)

Другие вопросы по тегам