FAQ по оптимизации PHP-скриптов

123 4
Progr@mmer\.
На сайте с 14.10.2007
Offline
44
3189

С Днем Победы!

Предлагаю создать FAQ по оптимизации PHP-скриптов.

Будем делиться своими советами и наблюдениями по быстродействию тех или иных функций и по их использованию.

Побудило меня создать эту тему использование циклов (for, foreach, while) - они работают с разной скоростью, но какой быстрее? Читал, что foreach самый медленный, но при тесте на локалхосте оказалось, что while. Правда, у меня тогда апач глючил. Всё же, какой из циклов самый быстрый и самый медлительный?

Не будем повторять то, что уже написано здесь (english) и здесь (russian).

P.S.: обфускаторы и зендеры не в счёт :)

Вашей девушке не хватает романтики? Черпните её на сайте «Я Люблю Романтику» (http://iloveromantics.ru/). Романтический форум (http://forum.iloveromantics.ru/) для отдыха от нудной работы.
tommy-gung
На сайте с 22.11.2006
Offline
300
#1

Убийство цикла for - слишком многа букаф

о циклах. В основном, о for

Здесь не могла быть ваша реклама
Николай В.
На сайте с 07.09.2006
Offline
62
#2

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

А если уж гнаться за скоростью во всем, то проще вообще отказаться от похапе.

Pavka
На сайте с 20.05.2005
Offline
82
#3
Николай В.:
Оптимизация, основанная на выборе тех или иных функций, мне кажется экономией на спичках. Сейчас гораздо проще купить более мощные железки/канал, чем тратить время на оптимизацию, которая даст копеечное ускорение.

А если уж гнаться за скоростью во всем, то проще вообще отказаться от похапе.

Есть такая пословица "Копейка рубль бережет" :)

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

armsites, Вы не правы.. тут о другом речь ;)

Без подписи
A0
На сайте с 22.09.2007
Offline
70
#4

Я считаю, что следует использовать циклы по их прямому предназначению: for для исполнения действий, которые требуют некоторое число, изменяемое с определенным шагом, (спорно) также для итерации numeric массивов; foreach для итерирования над объектом (включая массивы); while в остальных случаях. Особого различия в производительности как минимум в PHP нет.

Но опять же.

Одно дело

<?php

$array=array(1,2);
for($i=0,$c=count($array);$i<$c;$i++){}
foreach($array as $key=>$value){}
?>

- здесь в принципе можно использовать любой цикл, как удобнее. (Само собой надо делать поправку на ассоциативные массивы и в общем случае правильнее было бы использовать foreach() или даже foreach($array as $key=>&$value), чтобы не плодить лишние данные).

Но допускать такие вещи

<?php

for($i=0;$i<count($array);$i++){}
?>

вместо

<?php

for($i=0,$c=count($array);$i<$c;$i++){}
?>

конечно же нельзя в серьезных скриптах, которым и так есть, на что потратить процессорное время и время доступа к НЖМД.

Во всем остальном примерно также. Надо использовать возможности языка ради их прямого назначения, а не писать конструкции вида while($i++){if($i<10){}else{break;}} - ведь это идиотизм в общем случае.

ИМХО.

fleyg
На сайте с 21.09.2005
Offline
143
#5
Progr@mmer\.:
но при тесте на локалхосте оказалось, что while. Правда, у меня тогда апач глючил.

Вот интересно какая зависимость от выдачи апача, и собственно производительности цикла в пхп?

Может я что то туплю?

или Вы просто тестировали выдачу в браузер и на вскидку время чтоли определяли?

[Удален]
#6

Есть такая вещь - inner loop, раскрытие цикла с целью оптимизации по скорости выполнения, но в php такого рода оптимизация, на мой взгляд, не оправдана. Области применения for, while и foreach давно определены и освоены. Оптимизировать же нужно запросы к MySQL как наиболее ресурсоёмкие вещи.

Дмитрий
На сайте с 23.08.2006
Offline
222
#7
require_once дорого обходится.
Сообщения об ошибках дорого стоят

это про чо?

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

...повторяемся...

mod_gzip — модуль Apache, который позволяет сжимать ваши данные на лету и может уменьшить объем передаваемых данных до 80%.

Это вообще не в тему.

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

Ну а если уж руки из Ж растут, то тут ни то не другое не помогет :)

Разрабатываю и автоматизирую на php http://jonnyb.ru/
Progr@mmer\.
На сайте с 14.10.2007
Offline
44
#8

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

armsites,

1. Забудьте про поисковики! Делайте сайт для людей, а не для поисковиков!

2. Большинство хороших программистов знакомо с SEO, так что не надо "гнуть палку", что мы "неграмотны".

fleyg, у меня тогда весь комп глючил, а апач был в этом виной. Просто, ради интереса запустил цикл for($i = 0; $i < 100000000; $i++) {...} с user_abort (вроде так пишется) в false. Но, возможно, я не прав :-[ Serge_N, а если пишешь CMS на файлах и без БД, то что, и оптимизировать не надо? :)

JonnyB:
это про чо?

1. На сколько я понимаю, require_once хуже, чем include_once.

2. error_reporting || display_errors

JonnyB:
Лучше оптимизировать алгоритмы, при правильном подходе это гораздо более продуктивно (по отношению время/качество).

Оптимизировать алгоритмы - значит не сильно изменять код, т.е. оптимизировать код алгоритмов;

Менять алгоритмы - полностью изменять алгоритмы на более быстрые.

;)

A0
На сайте с 22.09.2007
Offline
70
#9
Progr@mmer\.:
1. На сколько я понимаю, require_once хуже, чем include_once.

Мда. Вот об этом я и говорил.

В названии функции заложено ее предназначение, а вы пишете хуже-лучше...

include_once (include=включить) - это включить код файла, при отсутствии файла вывести warning, скрипт не останавливать, повторно файл не включать.

require_once (require=требовать) - это включить код файла, при отсутствии файла вывести fatal error, скрипт остановить, повторно файл не включать.

Всё.

Progr@mmer\.
На сайте с 14.10.2007
Offline
44
#10

an0nym, буду знать. Спасибо :)

123 4

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий