Недавно я немного поработал с PHP, и во всем коде, который я видел, люди, как правило, используют несколько методов. (Они также склонны использовать несколько переменных, но это другая проблема.) Мне было интересно, почему это так, и я нашел эту заметку: «Вызов функции с одним параметром и пустым телом функции занимает примерно то же время, что и выполнение 7-8 $. Операции localvar ++. Подобный вызов метода, конечно же, составляет около 15 операций $ localvar ++ "здесь.
Верно ли это, даже если страница PHP была скомпилирована и кэширована? Следует ли мне по возможности избегать использования методов для повышения эффективности? Мне нравится писать хорошо организованный, удобочитаемый код с методами везде, где блок кода повторяется. Если необходимо написать плоский код без методов, существуют ли программы, которые будут "встроить" тела методов? Таким образом, я мог написать хороший код, а затем испортить его перед развертыванием.
Кстати, код, на который я смотрел, взят из ядра Joomla 1.5 и нескольких плагинов WordPress, поэтому я предполагаю, что это люди, которые знают, что делают.
Примечание: Я рад, что все перескочили на этот вопрос, чтобы поговорить об оптимизации в целом, но на самом деле мы говорим об оптимизации в интерпретируемых языках. Хоть бы намек на то, что мы говорим о PHP, было бы неплохо.
Фактически, вы делаете ложное предположение в конце своего поста. Некоторые из самых популярных PHP-проектов имеют не очень удачный код. На ум приходят OSCommerce, Wordpress и Drupal. Популярный! = Хорошо спроектированный.
Любое приложение PHP, которое существует уже 4 или 5 лет, было написано на совершенно другом языке, чем PHP, который существует сегодня. OO был просто намеком на обещание.
Также учитывайте психологические последствия: вы почувствуете себя намного лучше, написав красивый код, который может работать медленнее, чем писать уродливый код, который может работать быстрее. Для человеческой психики важно хорошо относиться к тому, что вы делаете.
я бы исключил Drupal из менее звездного кода. ОО это еще не все: drupal.org/node/547518.






Вы должны увидеть ответы на этот вопрос: Должен ли разработчик в первую очередь стремиться к удобочитаемости или производительности?
Подводя итог консенсусу: если вы не знаете наверняка (посредством тестирования / профилирования), что ваша производительность должна быть решена в какой-то конкретной области, удобочитаемость гораздо важнее.
Какая «эффективность» вам нужна? Ты хоть мерил? Преждевременная оптимизация - это корень всех зол, а оптимизация без измерения ВСЕГДА преждевременна.
Помните также правила Клуба Оптимизации.
Это великолепно. Добавлен в закладки.
Энди, это, вероятно, самостоятельный вопрос, но как бы вы измерили, что ваше приложение работает быстрее, чем транспортный протокол? Он ведь еще должен протереть транспорт, верно?
Предпосылка правила заключается в том, что если вы привязаны к вводу-выводу, то нет смысла беспокоиться о накладных расходах функций. Если вы потратите одну секунду на вычисление корзины данных и десять на ее транспортировку по сети, на диск или что угодно, тогда посмотрите на десять секунд, а не на одну.
SomeAnalogy расширяется. FightClub запрещен.
Жизнь может быть полна разочарований.
В 99% случаев лучше позаботиться о понятности кода. Пишите код, который легко тестировать, понимать и поддерживать.
В тех немногих случаях, когда производительность действительно критична, языки сценариев, такие как PHP, не лучший выбор. В конце концов, есть причина, по которой многие базовые библиотечные функции в PHP написаны на C.
Facebook использует PHP, поэтому явно критичные к производительности сайты могут работать на PHP. Не распространяйте FUD.
Если вы находитесь на этапе, когда вы считаете вызов метода и встроенные инструкции, вам будет МЕНТАЛЬНО использовать PHP! Пишите все на скомпилированном C, если вы ТАК заботитесь о скорости выполнения, а не о удобочитаемости.
Это не FUD - если код нуждается в супероптимизации, интерпретируемые языки не подходят.
Какое возможное приложение, которое мог будет решено в PHP, будет иметь такие требования к производительности, что будет слишком медленным в PHP? Это определенно FUD.
@Guido: может тебе стоит подумать либо о том, чтобы перефразировать это второе предложение, либо полностью удалить его. Я согласен с вами на 100% - гораздо важнее писать понятный, тестируемый и поддерживаемый код, чем беспокоиться о производительности - но прямая атака на PHP привела вас к оскорбительному признаку, который привел меня сюда. Может быть, что-то вроде ... «В тех немногих случаях, когда производительность действительно критична, языки сценариев, такие как PHP, не лучший выбор. В конце концов, есть причина, по которой многие базовые библиотечные функции в PHP написаны на C».
Сделанный. Я не хотел быть оскорбительным.
@ceejayoz Это интересное чтение (2009 г.) о PHP в FB webtoolkit.eu/wt#/blog/2009/12/17/…, в котором говорится: «Если бы вместо PHP использовался C++, то можно было бы отключить 22500 серверов (из 30000)» :)
Это чтение, по-видимому, игнорирует Facebook HipHop, а статистика, представленная в сообщении, кажется, взята из ниоткуда.
Лично, хотя могут возникнуть накладные расходы на вызов функции, если это означает, что я пишу код один раз (параметризованный), а затем использую его в 85 местах, я ПУТЬ впереди, потому что я могу исправить это в одном месте.
Языки сценариев, как правило, дают людям представление о том, что «достаточно хорошо» и «работает» - единственные критерии, которые следует учитывать при кодировании.
Конечно, не стоит писать плохой PHP-код. Но если у вас что-то написано плохо, вы всегда можете использовать производительность как оправдание :-)
Хороший! Приятно иметь варианты.
Это преждевременная оптимизация. Хотя верно утверждение, что вызов функции стоит больше, чем увеличение локальной целочисленной переменной (почти все стоит дороже), затраты на вызов функции по-прежнему очень низкие по сравнению с запросом к базе данных.
Смотрите также:
Основная сила PHP в том, что быстро и легко получить работающее приложение. Эта сила заключается в возможности писать неаккуратный (плохой) код, при этом он по-прежнему работает несколько ожидаемым образом.
Если вам нужно сэкономить несколько циклов процессора, PHP - не то, что вам следует использовать. Когда веб-приложения PHP работают плохо, это гораздо более вероятно из-за неэффективных запросов, а не из-за скорости выполнения кода.
Чтобы ответить на ваш первый вопрос, да, это правда, и это также верно для скомпилированного кода операции. Да, вы можете сделать свой код быстрее, избегая вызовов функций, за исключением крайних случаев, когда ваш код становится слишком большим из-за дублирования кода.
Вы должны делать то, что вам нравится: «Мне нравится писать хорошо организованный, удобочитаемый код с методами везде, где может повторяться блок кода».
Если вы собираетесь совершить это ужасное злодеяние, удалив все вызовы функций, по крайней мере, используйте профилировщик и сделайте это только с 10% вашего кода, который имеет значение.
Если вас так беспокоит эффективность, то почему вы вообще используете язык сценариев? Вы должны программировать на гораздо более быстром языке (вставьте сюда свой любимый скомпилированный язык), что, вероятно, приведет к более и менее читаемому коду, но он будет работать очень быстро, и вы все равно можете стремиться к лучшим методам кодирования.
Серьезно, если вы пишете код для скорости бега, вам вообще не следует использовать PHP.
Пример того, как микрооптимизация приводит к замедлению работы макросов:
Если вы серьезно рассматриваете возможность встраивания функций вручную, рассмотрите возможность развертывания циклов вручную.
JMP обходятся дорого, и если вы можете устранить циклы путем развертывания, а также исключить все условные блоки, вы избавитесь от всего этого времени, потраченного впустую, просто просматривая кеш процессора.
Увеличение переменных во время выполнения тоже происходит медленно, как и извлечение данных из базы данных, поэтому вы также должны встроить все эти данные в свой код.
Фактически, загрузка интерпретатора для простого выполнения кода и копирования памяти пользователю является чрезвычайно расточительной, почему бы нам просто не вычислить все возможные страницы и не сохранить каждую страницу в памяти, готовую к работе, так что это просто копия памяти ? конечно это быстро!
А, теперь между нами есть медленная штука, называемая Интернетом, которая мешает взаимодействию с пользователем и ограничивает количество контента, которое мы можем использовать, как насчет того, чтобы мы заранее вычислили страницы, заархивировали их все и запустили на пользователи локальная машина? это будет очень быстро!
Но это приведет к потере циклов процессора, их много, что, учитывая время загрузки страницы, рендеринг содержимого браузера и т. д., Мы пропустим посредника и просто доставим им страницы на печатных носителях! Гений !.
/ me наблюдает, как ваша компания разваливается на глазах, пока вы тратите 10 лет на предварительные вычисления (вручную) и печать страниц, которые никто не хочет видеть.
Вам это может показаться глупым, но для остальных из нас то, что вы предложили, просто смешно.
Оптимизация - это хорошо, но проведите черту где-нибудь разумно, чтобы вам не приходилось беспокоиться о будущих людях, которые будут работать над кодом, отслеживая вас во сне из-за того, что у вас такая дрянная кодовая база, которую невозможно поддерживать.
Примечание: да, я использую gentoo. как ты угадал?
Я только что понял, что этот длинный запутанный ответ на самом деле довольно крутой. Это правда: оптимизация и удобочитаемость - это произвольная точка отсечения, которую каждый выбирает.
Я думаю, Joomla и Wordpress - не лучшие примеры кода PHP хорошо, без обид. Я не имею ничего личного против людей, работающих над этим, и это здорово, как они позволяют людям иметь веб-сайт / блог, и я знаю, что многие люди тратят все свое свободное время на любой из этих проектов, но качество кода довольно низкое (с без обид).
Если вы мне не верите, просмотрите объявления о безопасности за последний год; также предполагая, что вы ищете производительность от любого из двух, их код также не преуспевает в этом. Так что это ни в коем случае не хороший код, но Wordpress и Joomla превосходны во внешнем интерфейсе - довольно просты в использовании, люди получают веб-сайт и могут выполнять вещи.
Вот почему они так успешны, что люди выбирают их не по качеству кода, а по тому, что они позволили им сделать.
Чтобы ответить на ваш вопрос о производительности, да, это правда, что все хорошие вещи (функции, классы и т. д.) Замедляют работу вашего приложения. Итак, я предполагаю, что если ваше приложение / сценарий все в одном файле, пусть будет так. Тогда не стесняйтесь писать плохой код PHP.
Как только вы расширите и начнете дублировать код, вам следует подумать о компромиссе (в скорости), который приносит с собой написание поддерживаемого кода. :-)
ИМХО, этот компромисс невелик по двум причинам:
Если через шесть месяцев вам нужно будет вернуться к своему коду, подумайте, сэкономили ли эти наносекунды его запуск, все равно прибавятся, когда вам нужно исправить неприятную ошибку (три или четыре раза из-за дублирования кода).
Вы можете делать все, что угодно, чтобы PHP работал быстрее. Обычно люди рекомендуют кеш, например БТР. APC действительно потрясающий. Он запускает для вас всевозможные оптимизации в фоновом режиме, например кэширует байт-код файла PHP, а также предоставляет вам функции в пользовательском пространстве для сохранения данных.
Так, например, если вы анализируете файл конфигурации каждый раз, когда запускаете этот скрипт, ввод-вывод диска действительно важен. С помощью простых apc_store () и apc_fetch () вы можете сохранить проанализированный файл конфигурации либо в файловом кэше, либо в кэше памяти (RAM) и извлекать его оттуда до тех пор, пока кеш не истечет или не будет удален.
Конечно, APC - не единственный кэш.
Все, что я когда-либо хотел в ответ на этот вопрос и многое другое! Спасибо, что поделился.
Мне было интересно, не только ли я думал, что код Wordpress действительно плохой.
Особенно с быстрым интерпретатором, таким как PHP, я не думаю, что отсутствие читабельности / ремонтопригодности КОГДА-ЛИБО стоит той эффективности, которую вы можете (или не можете!) Получить от этого.
И примечание о WordPress: я много просматривал код WordPress. Не думайте, что эти люди что-то знают о хорошем коде, пожалуйста.
Так верно о качестве WordPress.
У вас есть хороший пример PHP-кода? Скажем, приложение с открытым исходным кодом?
Если вы разрабатываете веб-приложения с использованием архитектурного шаблона MVC, вы можете значительно выиграть от кэширования и сериализации. Вы можете кэшировать представления или их части, а также сериализовать модели.
По опыту, модели часто анализируют и генерируют большую часть отображаемых данных. Если вы знаете, что определенная модель не будет часто генерировать новые данные, например модель, которая анализирует RSS-канал, вы можете просто заполнить ее где-нибудь всеми проанализированными данными и периодически обновлять.
Если вы посмотрите на php-код wordpress, он смешивает теги php между своим html, что приводит к спагетти в моей голове.
Однако в этом отношении Phpbb3 намного лучше. Например, в нем есть строгое разделение между частью php и частью стилей, которые представляют собой файлы в формате xhtml с тегами {template}, анализируемые механизмом шаблонов. Что намного чище.
Напишите пару 10-минутных примеров и запустите их в профайлере.
Это скажет вам, что быстрее до миллисекунды.
Если у вас нет профилировщика, опубликуйте их здесь, и я запущу их в моем профилировщике PHPEd.
Я подозреваю, что большая часть разницы во времени, если таковая имеется, возникает из-за необходимости открывать файл, в котором хранится класс, но это тоже нужно будет протестировать.
Затем спросите себя, заботитесь ли вы о нескольких миллисекундах по сравнению с необходимостью поддерживать спагетти-код - заметит ли кто-нибудь из ваших пользователей?
Редактировать
Профилировщик не будет имитировать большие объемы трафика, но он скажет вам, какой метод быстрее для одного пользователя и какие части кода используют сколько времени. Особенно, если вы профилируете повторяющиеся операции - скажем, по 1000 раз в цикле.
Мы можем предположить (хотя и не всегда), что более быстрый код, используемый множеством людей, будет быстрее, чем более медленный код, используемый множеством людей.
Производительность PHP не сильно ухудшается при одновременной нагрузке (если только вы не сделаете что-нибудь глупое, например, порождение 4000 интерпретаторов). Что больше всего ухудшает производительность базы данных (особенно сильно, если вы делаете что-то глупое, например, используя MyISAM).
Те, кто будет читать вам лекции о микрооптимизации кода, обычно те же самые, у которых будет 50 SQL-запросов на страницу, что в сумме займет 2 секунды, потому что они никогда не слышали о профилировании. Но их код оптимизирован !!! (и чертовски медленно)
Факт: добавить еще один веб-сервер несложно. Репликация базы данных есть. Оптимизация кода веб-сервера может привести к чистым убыткам, если добавит нагрузку на БД.
Примечание. 2-3 мс для простых страниц (например, темы форума), включая SQL, - хорошая цель для веб-сайта PHP. Мой старый сайт раньше делал это.
правда что. Что вы посоветуете для профилирования PHP?
Я обычно не профилирую PHP, за исключением вывода общего времени, затраченного на PHP-код, внизу страницы, чтобы администратор мог его посмотреть. Обычно это все необходимое профилирование. PHP работает достаточно быстро, если вы достаточно хорошо используете кеш кода и код. Я ДЕЛАЮ профиль - это SQL-запросы: поскольку я использую простую оболочку, которая автоматически экранирует аргументы, она регистрирует все запросы и время запросов и печатает список запросов + тайминги внизу каждой страницы (только если пользователь, конечно, является администратором). ).
PHP или нет, без каких-либо измерений невозможно сказать, что вы должны или не должны делать.