«влияние на производительность» при использовании одиночного класса из 20 тыс. строк - PullRequest
10 голосов
/ 26 декабря 2010

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

Ответы [ 2 ]

6 голосов
/ 26 декабря 2010

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

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

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

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

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

4 голосов
/ 26 декабря 2010

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

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

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

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

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

...