__get / __ set / __ вызвать вопросы производительности с PHP - PullRequest
5 голосов
/ 26 июля 2010

У меня есть пользовательский фреймворк MVC PHP, который я переписываю и у меня возник вопрос о производительности и магических методах.Что касается модельной части фреймворка, я подумал, что магические методы __get / __set приведут к тому, что слишком большое снижение производительности будет стоить использования.Я имею в виду доступ (чтение и запись) данных модели будет одной из самых распространенных операций.Является ли использование магических методов __get / __set слишком большим ударом по производительности для функциональных возможностей интенсивного использования, таких как часть модели инфраструктуры MVC?

Ответы [ 4 ]

8 голосов
/ 26 июля 2010

Мера.

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

Тем не менее, PHP редко является узким местом. Ввод-вывод и запросы к базе данных часто занимают гораздо больше времени. Это, однако, зависит от вашего использования; Единственный способ узнать наверняка это для сравнения.

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

7 голосов
/ 22 сентября 2010

Вот статья (три года) с некоторыми тестами. Запустите свои собственные тесты, чтобы увидеть, как это влияет на ваш код.

Вообще говоря, они намного медленнее. Но являются ли они узким местом? Это зависит от того, что вы делаете. Если вас беспокоит скорость, где она остановится? Цикл foreach медленнее, чем цикл for, однако большинство людей не переписывают весь свой код для использования for.

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

3 голосов
/ 26 июля 2010

Чисто из моего опыта, это добавляет много накладных расходов. На странице с примерно 4000 __get (да, на этой странице было довольно много данных) производительность была заметно медленнее, до такой степени, что стала неприемлемой. Я выбросил все __set и __get для переменных, которые не требуют изменения других данных или проверки внешних зависимостей (например, внешних ключей), после чего время создания этой страницы составляло около 15 % времени, которое потребовалось раньше.

0 голосов
/ 22 сентября 2010

Я только что задал себе тот же вопрос и пришел к такому же выводу: лучше установить свойства традиционным способом. __get () + массивный переключатель замедляет все

...