Оптимизация приложений на Php

Статус
Закрыто для дальнейших ответов.

RUSH

Читер
Регистрация
26.01.2006
Сообщения
230
Хотел бы знать все тонкости написания PHP-приложений. Для меня самое важное - это безопасность и оптимизация. Ну, про безопасность я читал много и в интернете статей хватает, а вот по оптимизации нет.

Выносите переменный и массивы из под кавычек

Нужно писать так: echo "My site - ".$site;
Так лучше не писать: echo "My site - $site";
И так тоже лучше не писать: echo "My site - {$site}";

Названия переменный как можно короче
Используйте короткие названия переменных, чем короче - тем лучше.
К примеру нужно писать не $vsego, а пожно просто - $all
Длина переменной не должна превышать 7 символов, иначе наблюдается спад скорости.

Вот что-то вроде этого жду от вас.
Флду запрещен.
 

Creator

Administrator
Команда форума
Регистрация
03.03.2005
Сообщения
1 745
Для меня самое важное - это безопасность и оптимизация.
Аналогично. Правда можно без проблем заняться тестированием оптимизации кода это не сложно и даже полезно;)
Нужно писать так: echo "My site - ".$site;
Так лучше не писать: echo "My site - $site";
И так тоже лучше не писать: echo "My site - {$site}";
По всем законам логики и по идее лучше писать так (т.е. не происходит поиск переменных в кавычках, а сразу отправляется на вывод):

Код:
echo 'My site - '.$site;
Но потестив заметил, что в кавычках " на микросекунды, но побыстрее:(

Было мнение что, лучше не делать множественный вывод вроде:

Код:
echo 'sfsafsaf';
echo 'sfsafsaf';
echo 'sfsafsaf';
echo 'sfsafsaf';
якобы быстрее будет:

Код:
$val='sfsafsaf';
$val.='sfsafsaf';
$val.='sfsafsaf';
$val.='sfsafsaf';
echo $val;
Но я решил потестить и заметил, что как раз подобный вариант на более 20% медленнее.

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

Далее истины (были протестированы мной и ИМХО, имеют больший приоритет):

Код:
for($i=0;$i<count($a);$i++){***}
Вообще не рекомендую использовать, т.к. в 1.5 раза медленнее, чем

Код:
$count=count($a);
for($i=0;$i<$count;$i++){***}
Далее регулярные выражения нужно использовать на основе PCRE, а не POSIX. Кто не знает использовать не ereg****, а preg_*****. Работает НАМНОГО быстрее практически в 90% случаев.

Конечно мои тесты не могут отличаться высокой точностью, но ясно дают понять, что быстрее, а что нет.
Даю "инструмент" для тестов:

Код:
<?
function get_microtime()
{
 list($msec,$sec)=explode(" ",microtime());
 $microtime=(float)$msec+(float)$sec;
 return $microtime;
}
$start_time=get_microtime();


for($i=0;$i<100;$i++)
{
 // элементы для иследования
}


  $end_time=get_microtime();
  $result_time=$end_time-$start_time;
  $result_time=round($result_time,6);
?>
Время генерации: <?=$result_time?> сек.
Присоединяйтесь!
 

RUSH

Читер
Регистрация
26.01.2006
Сообщения
230
Нужно сделать хорошую платформу для тестов:))) В общем нада как можно точнее засекать время или что там...

В общем предлагаю следующую базу для тестов:

<?php

function source() {

echo "123";

}

$t_micro = explode(" ", microtime());
$t_go = $t_micro[1] + $t_micro[0];

source();

$t_micro = explode(" ", microtime());
$t_end = $t_micro[1] + $t_micro[0];
$t_total = round(($t_end - $t_go), 5);

echo "<br /><br /><hr /><div align=\"center\">Скрипт был выполнен 1 раз за <b>".$t_total."</b> секунд</div><hr />";

$t_micro = explode(" ", microtime());
$t_go = $t_micro[1] + $t_micro[0];

for($i=0; $i < 500; $i++) {

source();

}

$t_micro = explode(" ", microtime());
$t_end = $t_micro[1] + $t_micro[0];
$t_total = round(($t_end - $t_go), 5);

echo "<br /><br /><hr /><div align=\"center\">Скрипт был выполнен ".$i." раз за <b>".$t_total."</b> секунд</div><hr />";

?>
Предлагаю потестировать немного, потом создать новый топик. прикрепить и вписывать туда результаты тестов.

Лично я для себя понял, что print работает с точно такой же скорость. как и echo, т.к. после 500 запусков разрыв был не больше чем на 0.00005 сенкунд. Ранее я думал по другому, т.к. наслушался всяких :)))
 

RUSH

Читер
Регистрация
26.01.2006
Сообщения
230
Код:
<?php

function source1() {

	echo "123";

}

function source2() {

	print "345";

}

/* Скрипт №1 - Тест */

$t_micro = explode(" ", microtime());
$t_go = $t_micro[1] + $t_micro[0];

source1();

$t_micro = explode(" ", microtime());
$t_end = $t_micro[1] + $t_micro[0];
$t_total_test1 = round(($t_end - $t_go), 5);

echo "\n\n<hr /><div align=\"center\">Скрипт №1 был выполнен 1 раз за <b>".$t_total_test1."</b> секунд</div><hr />\n\n";

/* Скрипт №2 - Тест */

$t_micro = explode(" ", microtime());
$t_go = $t_micro[1] + $t_micro[0];

source2();

$t_micro = explode(" ", microtime());
$t_end = $t_micro[1] + $t_micro[0];
$t_total_test2 = round(($t_end - $t_go), 5);

echo "\n\n<hr /><div align=\"center\">Скрипт №2 был выполнен 1 раз за <b>".$t_total_test2."</b> секунд</div><hr />\n\n";

/* Скрипт №1 - Мультитест */

$t_micro = explode(" ", microtime());
$t_go = $t_micro[1] + $t_micro[0];

for($i=0; $i < 500; $i++) {

source1();

}

$t_micro = explode(" ", microtime());
$t_end = $t_micro[1] + $t_micro[0];
$t_total_multi1 = round(($t_end - $t_go), 5);

echo "\n\n<hr /><div align=\"center\">Скрипт №1 был выполнен ".$i." раз за <b>".$t_total_multi1."</b> секунд</div><hr />\n\n";

/* Скрипт №2 - Мультитест */

$t_micro = explode(" ", microtime());
$t_go = $t_micro[1] + $t_micro[0];

for($i=0; $i < 500; $i++) {

source2();

}

$t_micro = explode(" ", microtime());
$t_end = $t_micro[1] + $t_micro[0];
$t_total_multi2 = round(($t_end - $t_go), 5);

echo "\n\n<hr /><div align=\"center\">Скрипт №2 был выполнен ".$i." раз за <b>".$t_total_multi2."</b> секунд</div><hr />\n\n";

echo "\n<div align=\"center\">Стандартный тест: ";
if ($t_total_test2 > $t_total_test1) {
	echo "Скрипт №1 быстрее скрипта №2 на <b>".($t_total_test2 - $t_total_test1)."</b> секунд";
} else {
	echo "Скрипт №2 быстрее скрипта №1 на <b>".($t_total_test1 - $t_total_test2)."</b> секунд";
}
echo "</div>\n";

echo "\n<div align=\"center\">Мульти-тест: ";
if ($t_total_multi2 > $t_total_multi1) {
	echo "Скрипт №1 быстрее скрипта №2 на <b>".($t_total_multi2 - $t_total_multi1)."</b> секунд";
} else {
	echo "Скрипт №2 быстрее скрипта №1 на <b>".($t_total_multi1 - $t_total_multi2)."</b> секунд";
}
echo "</div>";

?>
Вот немного расширенный вариант. Может кто сообразит это все сделать в виде красивой таблички?
 

RUSH

Читер
Регистрация
26.01.2006
Сообщения
230
Код:
<?php

function source1() {

	echo "123";

}

function source2() {

	print "345";

}

$count = 1000;

/* Скрипт №1 - Тест */

$t_micro = explode(" ", microtime());
$t_go = $t_micro[1] + $t_micro[0];

source1();

$t_micro = explode(" ", microtime());
$t_end = $t_micro[1] + $t_micro[0];
$t_total_test1 = round(($t_end - $t_go), 5);

echo "\n<hr />\n";

/* Скрипт №2 - Тест */

$t_micro = explode(" ", microtime());
$t_go = $t_micro[1] + $t_micro[0];

source2();

$t_micro = explode(" ", microtime());
$t_end = $t_micro[1] + $t_micro[0];
$t_total_test2 = round(($t_end - $t_go), 5);

echo "\n<hr />\n";

/* Скрипт №1 - Мультитест */

$t_micro = explode(" ", microtime());
$t_go = $t_micro[1] + $t_micro[0];

for($i=0; $i < $count; $i++) {

source1();

}

$t_micro = explode(" ", microtime());
$t_end = $t_micro[1] + $t_micro[0];
$t_total_multi1 = round(($t_end - $t_go), 5);

echo "\n<hr />\n";

/* Скрипт №2 - Мультитест */

$t_micro = explode(" ", microtime());
$t_go = $t_micro[1] + $t_micro[0];

for($i=0; $i < $count; $i++) {

source2();

}

$t_micro = explode(" ", microtime());
$t_end = $t_micro[1] + $t_micro[0];
$t_total_multi2 = round(($t_end - $t_go), 5);

if ($t_total_test2 > $t_total_test1) {
	$color_s1 = "green";
	$color_s2 = "red";
	$result_s = $t_total_test2 - $t_total_test1;
	$result_s = $result_s." (".(round(($result_s / $t_total_test2), 3) * 100)."%)";
} else {
	$color_s2 = "green";
	$color_s1 = "red";
	$result_s = $t_total_test1 - $t_total_test2;
	$result_s = $result_s." (".(round(($result_s / $t_total_test1), 3) * 100)."%)";
}

if ($t_total_multi2 > $t_total_multi1) {
	$color_m1 = "green";
	$color_m2 = "red";
	$result_m = $t_total_multi2 - $t_total_multi1;
	$result_m = $result_m." (".(round(($result_m / $t_total_multi2), 3) * 100)."%)";
} else {
	$color_m2 = "green";
	$color_m1 = "red";
	$result_m = $t_total_multi1 - $t_total_multi2;
	$result_m = $result_m." (".(round(($result_m / $t_total_multi1), 3) * 100)."%)";
}

echo "\n<hr />\n";
echo "<table align=\"center\" border=\"1\">\n";
echo "<tr><td align=\"center\" width=\"50\">№</td><td align=\"center\" width=\"150\">Стандарт (1 раз)</td><td align=\"center\" width=\"150\">Мульти (".$count." раз)</td></tr>\n";
echo "<tr><td align=\"center\" width=\"50\">1</td><td align=\"center\" width=\"150\"><font color=\"".$color_s1."\">".$t_total_test1."</font></td><td align=\"center\" width=\"150\"><font color=\"".$color_m1."\">".$t_total_multi1."</font></td></tr>\n";
echo "<tr><td align=\"center\" width=\"50\">2</td><td align=\"center\" width=\"150\"><font color=\"".$color_s2."\">".$t_total_test2."</font></td><td align=\"center\" width=\"150\"><font color=\"".$color_m2."\">".$t_total_multi2."</font></td></tr>\n";
echo "<tr><td align=\"center\" width=\"50\">X</td><td align=\"center\" width=\"150\">".$result_s."</td><td align=\"center\" width=\"150\">".$result_m."</td></tr>\n";
echo "</table>\n";

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

RUSH

Читер
Регистрация
26.01.2006
Сообщения
230
Код:
echo 'sfsafsaf';
echo 'sfsafsaf';
echo 'sfsafsaf';
echo 'sfsafsaf';
Код:
$val='sfsafsaf';
$val.='sfsafsaf';
$val.='sfsafsaf';
$val.='sfsafsaf';
echo $val;
Первый вариант быстрее второго в среднем на 40% (Мульти-тест, 1000 раз подряд)

Код:
$site1 = "xxx";
echo "My site - ".$site1;
Код:
$site2 = "xxx";
echo 'My site - '.$site2;
Первый вариант МЕДЛЕНЕЕ второго в среднем на 10% (Мульти-тест, 1000 раз подряд)
 
Статус
Закрыто для дальнейших ответов.
Верх Низ