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

Серьезно, должен ли я писать плохой PHP-код?

В последнее время я занимаюсь работой с PHP, и во всем коде, который я видел, люди склонны использовать несколько методов. (Они также имеют тенденцию использовать несколько переменных, но это другая проблема.) Мне было интересно, почему это так, и я нашел эту заметку "Вызов функции с одним параметром и пустым телом функции занимает примерно то же время, что и 7-8 $localvar ++. Аналогичный вызов метода - это, конечно, около 15 $localvar ++ операций здесь.

Это правда, даже когда страница PHP была скомпилирована и кэширована? Должен ли я избегать использования методов в максимально возможной степени для эффективности? Мне нравится писать хорошо организованный, удобочитаемый код с методами везде, где будет повторяться блок кода. Если необходимо писать плоский код без методов, существуют ли какие-либо программы, которые будут "встроенными" методами? Таким образом, я мог бы написать хороший код, а затем уродливый до развертывания.

Кстати, код, который я просматривал, - это ядро ​​Joomla 1.5 и несколько плагинов WordPress, поэтому я предполагаю, что они - люди, которые знают, что они делают.

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

4b9b3361

Ответ 1

Я думаю, что Joomla и Wordpress не являются лучшими примерами хорошего PHP-кода без обид. У меня нет ничего личного против людей, работающих над этим, и это здорово, как они позволяют людям иметь сайт/блог, и я знаю, что многие люди тратят все свое свободное время на любой из этих проектов, но качество кода довольно плохое (с без обид).

Просмотрите объявления безопасности за последний год, если вы мне не верите; также предполагая, что вы ищете производительность от любого из двух, их код также не преуспевает. Так что это отнюдь не хороший код, но Wordpress и Joomla оба превосходны на интерфейсе - довольно проста в использовании, люди получают сайт и могут делать что-то.

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

Чтобы ответить на ваш вопрос о производительности, да, это правда, что все хорошие вещи (функции, классы и т.д.) замедляют ваше приложение. Поэтому я думаю, если ваше приложение / script находится в одном файле, пусть будет так. Не стесняйтесь писать плохой PHP-код.

Как только вы расширяетесь и начинаете дублировать код, вы должны учитывать компромисс (по скорости), который приносит с собой код поддерживаемого кода.: -)

ИМХО этот компромисс довольно мал из-за двух вещей:

  • CPU дешево.
  • Разработчики не дешевы.

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

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

Так, например, при анализе файла конфигурации каждый раз, когда вы запускаете этот script диск в/в действительно критичен. С помощью простого apc_store() и apc_fetch() вы можете сохраните анализируемый файл конфигурации либо в кеше на основе файлов, либо на базе памяти (ОЗУ) и извлечете его оттуда до истечения срока действия кеша или удаления.

Конечно, APC - это не единственный кеш.

Ответ 2

Сколько "эффективности" вам нужно? Вы даже измерили? Преждевременная оптимизация - это корень всего зла, а оптимизация без измерения ВСЕГДА преждевременна.

Помните также правила Оптимизационного клуба.

  • Первое правило Optimization Club - это не оптимизация.
  • Второе правило Клуба Оптимизации - это не оптимизация без измерения.
  • Если ваше приложение работает быстрее, чем базовый транспортный протокол, оптимизация завершена.
  • Один фактор за раз.
  • Нет рыночных мер, нет графиков рынка.
  • Тестирование будет продолжаться до тех пор, пока оно должно быть.
  • Если это ваша первая ночь в Оптимизационном клубе, вам нужно написать тестовый пример.

Ответ 3

Вы должны увидеть ответы на этот вопрос: Должен ли разработчик ориентироваться на читаемость или производительность в первую очередь?

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

Ответ 4

В 99% случаев вам лучше беспокоиться о понятности кода. Напишите код, который легко тестировать, понимать и выполнять.

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

Ответ 5

Лично, хотя для вызова функции могут быть накладные расходы, если это означает, что я однажды пишу код (параметризованный), а затем использую его в 85 местах, я WAY дальше, потому что я может исправить его в одном месте.

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

Ответ 6

Особенно с быстрым интерпретатором, таким как PHP, я не думаю, что недостаток читаемости/ремонтопригодности EVER стоит того, что вы можете (или не можете!) получить от него.

И заметка о WordPress: я много раз просматривал код WordPress. Не думайте, что эти люди знают что-нибудь о хорошем коде, пожалуйста.

Ответ 7

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

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

Если вы собираетесь совершить это ужасное зверство при удалении всех вызовов функций, по крайней мере, используйте профилировщик и делайте это только с 10% вашего кода.

Ответ 8

Пример того, как микро-оптимизация приводит к замедлению макросов:

Если вы серьезно рассматриваете возможность ручной установки функций, рассмотрите рулонные развертки вручную.

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

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

Фактически, загрузка переводчика для простого выполнения кода и копирования памяти пользователю является исчерпывающим, почему бы нам просто не предварительно вычислить все возможные страницы и сохранить каждую страницу в памяти, готовую к работе, так что просто MEM-копию? конечно, это быстро!

А теперь у нас эта медленная вещь называется Интернетом между нами, что затрудняет работу с пользователями и ограничивает количество контента, которое мы можем использовать, как насчет предварительного расчета страниц заранее и архивирования их всех и запуска их на локальной машине пользователей? это будет очень быстро!

Но это будет тратить циклы процессора, их много, то, что при загрузке страницы и рендеринг содержимого браузера и т.д., мы пропустим посредника и просто доставим страницы на них на печатные носители!. Genius!.

/me наблюдает, как ваша компания рушится на лице, пока вы проводите предварительную компьютерную обработку (вручную) и печатные страницы, которые никто не хочет видеть.

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

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

примечание: да, я использую gentoo. Как ты догадался?

Ответ 9

Конечно, вы не должны писать плохой PHP-код. Но как только у вас что-то написано плохо, вы всегда можете использовать производительность как оправдание: -)

Ответ 10

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

См. также:

Википедия → Оптимизация → Когда оптимизировать

c2.com Wiki → Преждевременная оптимизация

Ответ 11

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

Если вы в состоянии сохранить несколько циклов процессора, PHP не то, что вы должны использовать. Когда веб-приложения PHP работают плохо, это гораздо более вероятно из-за неэффективных запросов, а не от скорости выполнения кода.

Ответ 12

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

Серьезно, если вы кодируете скорость работы, вы не должны вообще использовать PHP.

Ответ 13

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

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

Ответ 14

Если вы посмотрите на PHP-код Wordpress, он смешивает теги php между его html, что приводит к спагетти в моем сознании.

Phpbb3, однако, лучше в этом отношении. Например, он имеет строгое разделение между частью php и частью стилей, которые являются файлами в формате xhtml с тегами {template}, анализируемыми движком шаблонов. Это намного чище.

Ответ 15

Напишите пару 10-минутных примеров и запустите их в своем профилировщике.

Это скажет вам, что быстрее на миллисекунду.

Если у вас нет профилировщика, отправьте их здесь, и я запустил их в своем профилировщике PHPEd.

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

Затем спросите себя, не заботитесь ли вы о нескольких миллисекундах, а также о необходимости сохранять код спагетти - кто-нибудь из ваших пользователей когда-нибудь заметит?

Edit

Профилировщик не будет имитировать высокие объемы трафика, но он скажет вам, какой метод выполняется быстрее для одного пользователя, и какие части кода используют сколько времени. Особенно, если вы просматриваете операции, выполняемые повторно - скажем 1000 раз в каждом цикле.

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

Ответ 16

Те, кто прочитает вам о микро-оптимизации кода, как правило, будут теми же, у которых будет 50 запросов SQL на страницу, занимая в общей сложности 2 секунды, потому что они никогда не слышали о профилировании. Но их код оптимизирован!!! (и медленно, как ад)

Факт: добавление другого веб-сервера не сложно. Репликация базы данных. Оптимизация кода веб-сервера может быть чистым убытком, если он добавляет нагрузку на БД.

Примечание: 2-3 мс для простых страниц (например, тема форума), включая SQL, является хорошей мишенью для веб-сайта PHP. Мой старый сайт использовал это.