Личный сайт Андрея Сабинина

Сайт не обновляется с начала 2011 года, так как у меня на это нет ни времени, ни желания.

 

Основы оптимизации

sap, 3-го июля 2008 года в 22:32

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


В первую очередь

В первую очередь нужно понимать, что и как оптимизировать. То есть, если у вас есть php-код, который выполняется за 0.001 секунды, и sql-запрос, который выполняется 0.1 секунды, то оптимизировать нужно именно запрос — потому что как бы вы не терзали php, существенного прироста в быстродействии это не даст. Забегая вперед, скажу, что sql-запросы — самое слабое место web-приложений с точки зрения быстродействия, потому им (и их количеству) нужно уделять довольно много внимания.

Оптимизация php-кода

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

Итак, первая категория правил:

  • echo работает быстрее, чем print;
  • require_once работает медленней, чем require;
  • несколько параметров в echo работает быстрее, чем конкатенация;
  • подавление ошибок с помощью @ работает медленно;
  • if (isset($var)) значительно быстрее if (@$var);
  • строки, заключенные в апострофы ('), обрабатываются быстрее строк, заключенных в кавычки (");
  • __set, __get и __autoload работают медленно;
  • указание полных путей в include и require ускоряет работу скрипта;
  • unset ненужных переменных может быть весьма полезен.

Вторая категория:

  • не используйте рекурсию, если без нее можно обойтись;
  • for ($i = 0; $i < count($array); $i) — так делать нежелательно, посколько count будет срабатывать при каждом прохождении цикла, лучше вынести это значение в переменную до начала цикла;
  • str_replace работает гораздо быстрее, чем preg_replace;
  • PCRE в подавляющем большинстве случаев быстрее POSIX;
  • $array['key'] намного быстрее, чем $array[key];
  • unset крупных массивов данных может значительно освободить память;
  • старайтесь инициализировать переменные заранее (например, перед инкрементом);
  • не забывайте о кешировании.

Теперь перейдем к «слабому звену» — работе с БД

Эти правила очень важны, так как именно они позволяют значительно ускорить работу приложения. Для начала о взаимодействии PHP и БД:

  • не открывайте несколько подключений к БД;
  • не используйте запросов в цикле;
  • старайтесь минимизировать количество запросов (впрочем, иногда сложный JOIN работает дольше двух SELECT);
  • закрывайте подключение, если оно больше не нужно;
  • но не открывайте/закрывайте его по несколько раз;
  • не забывайте о sql-функции COUNT, если вам нужно количество элементов.

И о самих базах данных:

  • еще раз — не используйте запросов в цикле — формируйте в цикле сложный запрос и выполняйте, а не на каждой итерации запрос;
  • используйте индексы для полей, часто используемых при выборке и поиске;
  • индекс (и выборка) по INT полям выгодней индекса по VARCHAR и, тем более, TEXT полям;
  • JOIN, ORDER BY, GROUP BY при возможности делайте по индексам;
  • не используйет SELECT * FROM, перечисляйте поля вручную, если только не уверены на 100%, что вам нужны все поля;
  • при выборке заранее известного количества записей (в том числе одной, в особенности не по индексу) используйте LIMIT;
  • старайтесь использовать пагинатор (постраничный вывод);
  • используйте INSERT INTO ... VALUES () вместо нескольких INSERT.

Дополнения к статье приветствуются :-).

 −1
+12 

Евгений, 6-го июля 2008 года в 22:41

Со всеми пунктами согласен. Но чем echo от print отличается до сих пор не знаю.

sap, 7-го июля 2008 года в 00:24

Ну на эту тему уже не один холивар был :-)
echo быстрее потому, что в отличии от print эта конструкция (именно конструкция, а не функция) ничего не возвращает.
Еще о различиях можно почитать в этой статье.

md5, 10-го июля 2008 года в 16:58

все вокруг обсуждают эхо и принт, вам делать нехер? О_о

sap, 10-го июля 2008 года в 19:16

Да ладно, статья же не про echo и print. Я вообще не считаю это важным, но упомянуть нужно же было.

Евгений, 12-го июля 2008 года в 21:39

Да вы что?! Echo пишется короче, соответвенно ускоряет процесс разработки програмного кода :-P.

SAP, thx.

md5, 14-го июля 2008 года в 12:18

ога, аж на 20%!

adw0rd, 11-го июля 2008 года в 14:48

Спасибо Сап, хорошая подборка истин :)

гость, 8-го августа 2008 года в 14:13

>несколько параметров в echo работает быстрее, чем конкатенация;
А Вы пробывали тестить?
ИМХО, перед тем как копипастить - тестируйте, а потом уже выдвигайте как теорию

sap, 8-го августа 2008 года в 14:40

Результаты теста при 10000 итераций:

1. Время выполнения при использовании нескольких параметров: 0.014083 секунд
Время выполнения при использовании конкатенации: 0.079328 секунд

2. Время выполнения при использовании нескольких параметров: 0.027460 секунд
Время выполнения при использовании конкатенации: 0.050411 секунд

3. Время выполнения при использовании нескольких параметров: 0.013723 секунд
Время выполнения при использовании конкатенации: 0.075014 секунд

гость, 8-го августа 2008 года в 15:05

Я просто тестировал при включённой буферизацией (ob_start). Можно сказать, что разница очень незначительна.
Результаты при 10000 итерации.

параметры: 0.00536298751831
слияние: 0.0066990852356

параметры: 0.00543189048767
0.00687503814697

параметры: 0.00609707832336
слияние: 0.00640988349915

P.S. это бред, считать что быстродействие echo перед print хоть как то, значительно, повлияет на быстродействие сайта.

sap, 8-го августа 2008 года в 16:43

Ну видите, действительно чуть-чуть быстрее.

На счет того, что это никак значительно не повлияет на быстродействие сайта — согласен с вами на 100%. Об этом, кстати, сказано в статье :)

sap, 8-го августа 2008 года в 14:43

Вообще, при написании статьи старался не копипастить, а писать как раз только то, что проверено на собственном опыте. Разумеется, я не буду утверждать, что сам это все узнал — что-то прочитал и убедился, что это так, что-то сам понял. Но это все можно назвать моим личным опытом.