Я слышал о некоторых рекомендациях по производительности для PHP, таких как использование strtr()
над str_replace()
над preg_replace()
зависимости от ситуации.
Что касается некоторых функций над другими и стиля кода, каковы некоторые из рекомендаций по производительности, о которых вы знаете?
Изменить: я не говорю об использовании вещей, которые делают код менее удобочитаемым, например !isset($foo{5}
over strlen($foo) < 5
, я говорю о вещах, таких как использование preg_-функций над функциями ereg_ для regex ,
Изменить: причина, по которой я прошу об этом, заключается не в том, чтобы оптимизировать, а для того, чтобы получить общее представление о том, что имеет тенденцию быть наиболее эффективным в ограниченном наборе альтернатив. Например, проверка того, возвращает ли оператор mysql ошибку, является, вероятно, лучшей практикой, чем подавление ошибок для начала.
Этот вопрос действительно расплывчатый. Если вы хотите оптимизировать свой скрипт, сначала проверьте свою базу данных и попытайтесь оптимизировать свои алгоритмы. Не так уж много чистых рекомендаций по производительности PHP, которые будут иметь значение. Посмотрим :
Комманентные переменные быстрее, чем просто помещать их в строку с двумя кавычками.
$var = 'Hello ' . $world; // is faster than $var = "Hello $world"; // or $var = "Hello {$world}";
Да, это быстрее, но вторая и третья форма еще более удобочитаемы, а потеря скорости настолько низкая, что даже не имеет значения.
При использовании цикла, если ваше условие использует константу, поставьте ее перед циклом. Например :
for ($i = 0; $i < count($my_array); $i++)
Это будет оценивать счет ($ my_array) каждый раз. Просто сделайте дополнительную переменную перед циклом или даже внутри:
for ($i = 0, $count = count($my_array); $i < $count; $i++)
Самое худшее – это, безусловно, запросы внутри циклов. Либо из-за недостатка знаний (попытка имитировать JOIN в PHP), либо просто потому, что вы не думаете об этом (многие вставляют в цикл, например).
$query = mysql_query("SELECT id FROM your_table"); while ($row = mysql_fetch_assoc($query)) { $query2 = mysql_query("SELECT * FROM your_other_table WHERE id = {$row['id']}"); // etc }
Никогда не делай этого. Это просто INNER JOIN.
Есть, вероятно, больше, но на самом деле их не стоит записывать. Напишите свой код, оптимизируйте его позже.
PS Я начал писать этот ответ, когда его не было, могут быть некоторые вещи, уже сказанные в ссылках.
Изменить: по какой-то причине я не могу правильно отформатировать код. Я действительно не понимаю, почему.
ОПТИМИЗАЦИЯ ПРЕПОДАВАТЕЛЕЙ – КОРН ВСЕГО ЗЛА
И это самый важный вопрос, который вам нужен. Если в какой-то момент у вас возникла настоящая проблема с производительностью, профилируйте приложение, обнаружите скомпрометированные области и пришли сюда, чтобы снова спросить 🙂
Если вы ищете хорошие советы о том, как программировать код, чтобы он был наиболее эффективным, обратитесь к http://www.phpbench.com/ . Они показывают много сравнений по различным аспектам программирования, поэтому вы можете использовать лучшие методы, соответствующие вашим потребностям. Как правило, все зависит от того, хотите ли вы экономить на мощности обработки или использовании памяти.
http://talks.php.net/show/digg/0 – беседа с самим PHP по производительности
http://code.google.com/speed/articles/optimizing-php.html – Рекомендации Google о том, как ускорить работу приложений
Чаще всего ваши проблемы связаны не с PHP, а с задачами MySQL или HTTP.
Это может показаться немного экстремальным, но …
PHP очень медленный. Это неоспоримо. Это один из самых медленных языков. Если вы действительно хотите хорошего и стабильно хорошего качества, я собираюсь остановиться здесь и использовать другой язык.
Полностью противоречит утверждению о том, что PHP является самым медленным языком, вы можете обнаружить, что в некоторых случаях он превосходит почти каждый интерпретируемый язык. Это связано с тем, что PHP первоначально был предназначен как очень простая оболочка для C, и многие из ваших функций PHP обертывают функции C, что делает их довольно быстрыми. Это на самом деле имеет тенденцию иметь место с большинством интерпретируемых языков, но это гораздо более заметно в PHP.
PHP такой. Это один из самых возмутительных языков, где есть коллекция противоречивых атрибутов, которые являются крайними противоположностями. Это один из самых непоследовательных, но среди самых простых. PHP является одним из худших языков, которые выросли более органично, чем придерживаться дизайна, но он является одним из самых продуктивных языков в качестве DSL для веб-разработки. PHP очень плохо масштабирует еще один из самых масштабируемых веб-языков, когда он запускается под Apache. Я мог бы продолжать, но дело в том, чтобы ожидать путаницы, когда дело доходит до PHP.
Ditching PHP не без затрат. Производительность в PHP, как правило, намного выше, чем на других языках для webdev, и бар для входа очень низок.
Если вы хотите иметь лучшее из обоих миров, тогда просто сделайте свой PHP-код максимально простым с целью, в первую очередь, работать, чем быстро. Следующим шагом после этого является обеспечение хороших журналов, чтобы вы могли найти запросы с наивысшей задержкой или использовать максимум ресурсов. Как только вы это узнаете, вы сможете ориентироваться на профилирование. Подумайте об этом так, ваши журналы расскажут вам, какой файл или запрос профиля, ваше профилирование покажет вам, какие строки или блоки кода медленны.
Также полезен общий мониторинг ресурсов. Например, если ваше использование внешнего процессора составляет менее 5%, зачем делать что-либо, если задержка не возникает где-то? Это также помогает дать вам больше советов о том, где PHP застопорился (где узкие места, сеть, жесткий диск ввода-вывода, память, процессор и т. Д.). Также имейте в виду, что сегодня аппаратное обеспечение действительно действительно дешево, и бросать аппаратное обеспечение при проблемах может оказаться намного более эффективным. Такой мониторинг снова позволяет использовать целенаправленный подход. Я старик с опытом ограниченного оборудования, и я могу рассказать вам в тот день, когда я использовал преждевременную оптимизацию. Это даст хороший доход, но сегодня этого просто нет. Обычно я могу потратить месяц на то, чтобы что-то оптимизировать, и за ту же стоимость человеко-часов купите некоторое оборудование, которое может привести к увеличению производительности в два раза без больших усилий. Я бы не стал слишком далеко, аппаратное обеспечение не решает все, но смотря на это так, независимо от того, сколько вы пытаетесь оптимизировать, есть жесткие ограничения, представленные аппаратным обеспечением, поэтому, если вы заходите слишком далеко, пытаясь заставить его работать с плохим оборудованием вы быстро попадете в область уменьшения прибыли.
Как только вы найдете эти проблемные области, вы можете попытаться оптимизировать их с помощью лучшего PHP или кеширования. В большинстве случаев этого может быть достаточно. Часто вы можете обнаружить, что PHP не является узким местом, а чем-то другим, например доступом к базе данных.
Если вы обнаружите, что не можете оптимизировать PHP или кешировать, вам нужно подумать о чем-то другом. Использование другого языка – это вариант, и, конечно же, здесь появляется возможность использования C, а затем его перенос в PHP как расширение. C дороже писать вообще, поэтому этот подход позволяет использовать его только там, где вам это нужно, или, скорее, где вы получаете наибольшую пользу. Это называется оптимизацией «горячей точки».
Вне этого есть много других альтернатив, и вам не нужно обматывать только C, но если PHP не может этого сделать, PHP не может этого сделать. Вы также можете рассмотреть масштабирование по нескольким узлам или процессам, но имейте в виду, что в большинстве случаев PHP не очень хорошо масштабируется, когда речь заходит о параллельной обработке.
Независимо от того, что вы решите, когда дело доходит до этого, мы можем дать 1000 советов о микро-оптимизации. Возможно, один из лучших из всех раундов, я могу дать вам это, чтобы попытаться установить как можно меньше PHP-функций, потому что они будут выполнять массовые операции на C намного быстрее. Вы также должны следовать хорошим теоретическим концепциям, когда речь заходит о разработке алгоритма о таких вещах, как временная сложность, поскольку они универсальны. На самом деле, большинство советов по производительности, которые могут вам дать, вероятно, станут концепциями общего программирования, а не специфичными для PHP. Я также предлагаю избегать раздувания библиотеки или громоздких фреймворков. Чем больше они обещают, тем более вероятно, что это слишком хорошо, чтобы быть правдой в реальном мире. Простота – ключ, и в то время как библиотеки всегда хороши, подумайте сначала, вы включаете десять тысяч строк кода, чтобы спасти вас, написав десять строк из сотни, которые вы могли бы превратить в функцию и повторно использовать. Наконец, использование Opcache или APC, если вы используете версии PHP ниже 5.5, мгновенно даст хорошее повышение скорости на временах разбора PHP и сделает это несерьезным.
Тем не менее, тема о том, что быстрее, чем то, что в какой ситуации грозит тысячами вещей против тысяч вещей, поэтому лучше всего изучить и узнать больше о том, что такое PHP на самом деле, как он работает, и как измерять, тестировать и анализировать производительность , Оптимизация десяти строк кода может стать дебатом на 10000 слов. Представьте свое приложение, когда оно содержит тысячи строк кода.
В некоторых случаях я понимаю, насколько важна или выгодна упреждающая и микро-оптимизация. Однако на самом деле, как правило, практически невозможно достичь такого рода выигрышей, которые вы ожидаете (опять же, я должен сказать, что самое большое влияние, которое вы можете иметь, если вы действительно заботитесь о производительности, – это вообще отказаться от PHP, в основном это можно увидеть, как спросить, как могу ли я сделать улитку быстро, ответ – если скорость так важна, используйте что-то построенное для этого). Даже опытным и знающим может быть трудно с этим. Почти никто не понимает это в первый раз. Поэтому, когда вы действительно хотите потратить усилия, это ремонтопригодность. Держите свой код в порядке, порядке и хорошо организованном. Используется VCS, чтобы иметь возможность легко удалять вещи (не комментируйте код или переименовывать файлы в .old). Удостоверьтесь, что вы остаетесь СУХОЙ и, как правило, придерживаетесь хороших практик TIAS, Google и т. Д.
Обычно предварительная зрелая оптимизация – это нехорошая идея. Это действительно не имеет значения, когда вы делаете код быстрее на 0,5 мс, когда один запрос SQL занимает 80 мс.
Вы должны профилировать код и сосредоточиться на шейках бутылки, а затем попробовать такие вещи, как кеширование (статические, APC, Memcached). Микрооптимизация – это последний шаг, когда у вас есть идеальный дизайн приложения и по-прежнему требуется большая производительность от определенных модулей / функций.
Предположим, у вас есть множество слов.
Например: $words=array('banana','cat','tuna','bicycle','kitten','caffeine');
И тогда у вас есть поисковый запрос для поиска, например: $find='ca';
И вы хотите знать все элементы, начинающиеся с данного термина.
Обычно мы делаем так:
foreach($words as &$word)if(preg_match('@^'.$find.'@',$word))echo $word,'<br>';
Или самый быстрый способ:
foreach($words as &$word)if(strpos($find,$word)==0)echo $word,'<br>';
Но почему бы нам просто не сделать так:
foreach($words as &$word)if($find==($find&$word))echo $word,'<br>';
Вы бреете несколько байтов И это быстрее, потому что вам не нужно тратить время на вызов функций.
По возможности используйте одиночные, а не двойные кавычки. (Или даже переменная, такая же глупая, как это звучит). Злоупотребляйте ассоциативными массивами PHP, они являются хеш-таблицами и очень быстро подходят для любого вида поиска.
Тем не менее, не фокусируйтесь на производительности на низком уровне. Задачи, которые вы выполняете на PHP, обычно очень просты. Обычно они часто повторяются. Это означает, что реальный фокус, который вы должны иметь для скорости, находится вокруг границ PHP.
Сосредоточьтесь на скорости между PHP и вашей базой данных. Сосредоточьтесь на размере разметки на выходе. Фокусируйтесь на кеше.
ОЧЕНЬ редко, что вы увидите какую-либо победу над оптимизацией самого кода. По крайней мере, по шкале выбора одной функции над другой. Ясно, что вы хотите избежать избыточного или бесполезного повторения. Но помимо этого вы не должны волноваться.
Вы должны измерить, прежде чем будете оптимизировать. Без измерений у вас не может быть целей. Без целей вы тратите свое время.
Если вы обнаружите, что ваша веб-страница занимает 250 мс для рендеринга, это достаточно быстро? Если нет, то как быстро это должно быть? Он не достигнет нуля. Вам нужно, чтобы он составлял 200 мс?
Используйте инструмент, например XDebug ( http://www.xdebug.org/ ), чтобы определить, где находятся горячие точки в вашем коде. Скорее всего, вы обнаружите, что ваше приложение занимает 80% своего времени, обращаясь к базе данных. Если ваше приложение принимает 200 мс для получения данных из базы данных и 0,01 мс в str_replace
, то ускорения перехода на strtr
или использование echo
вместо print
настолько малы, что не имеют значения.
Мечта о возможности использования strtr
вместо str_replace
и получения заметных измеримых ускорений – это фантазия.
Этот вопрос (и ответы) довольно устарел, однако он поднялся выше в списках, когда я googled для «производительности PHP».
В то время как jgmjgm делает некоторые хорошие моменты, время выполнения PHP обычно является крошечной частью времени, которое пользователь тратит на ожидание появления страницы, но объясняет, почему, не говоря уже о детализации средств правовой защиты , здесь слишком много.
Первым шагом является определение того, что занимает больше всего времени – и для веб-приложения вы должны начать в браузере. У Google Chrome хороший профилировщик и для Firefox есть расширение Firebug. Если медленный бит – это PHP, то копайте дальше с помощью профайлера, такого как xdebug, но помните, что это будет охватывать любую базу данных и файл IO.
Это очевидно, но создание объектов также дорого, поэтому, например, если вам нужна временная метка, выполняющая время (), она удваивается быстрее, чем выполнение date_create () -> getTimestamp.
for ($a=1;$a<1000000;$a++) { $e = time(); // In my tests about 2x faster than: //$e = date_create()->getTimestamp(); }
Calculate Only Once Calculate и присваивать значение переменной, если это значение используется во много раз, а не вычисляет его снова и снова, когда оно используется.
Например, следующее ухудшит производительность.
for( $i=0; i< count($arrA); $i++){ echo count($arrA); }
Сценарий ниже будет работать намного лучше.
$len = count($arrA); for( $i=0; i< $len; $i++){ echo $len;
}
Используемые переключатели
Используйте JSON вместо XML во время работы с веб-службами, поскольку есть встроенная функция php, такая как json_encode () и json_decode (), которые очень быстрые. 7. Используйте isset Используйте isset (), где это возможно, вместо использования count (), strlen (), sizeof (), чтобы проверить, превышает ли значение значение, чем 0.