Blackfire: Как работает анализ скорости

Для глубокого анализа «почему все не так» существует множество инструментов. Попробуем использовать новенький анализатор скорости PHP — Blackfire (выпуск от декабря 2014). Самое сложное в нем — поставить на хостинг (заметьте, вам нужно будет и клиент, и расширение для php ставить аккуратно и внимательно следуя инструкции. На виртуальном хостинге это вопрос, а на выделенном — все получается достаточно легко.

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


на сложном сайте все работает


граф выполнения

Простейшая легкая страница

Как мы видим — сама первичная загрузка ПХП скрипта — это достаточно долго на нашем тестовом сервере) поэтому куда бы мы потом не усложняли — вот наш нижний лимит(

<!--?php
echo 'dsfgsdfg';

simplest

Простейшая тяжелая страница

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

<!--?php
$fact = 1;
for($i = 2; $i<100; $i++) {
	$fact *= $i;
	echo $i . ' ' . $fact . '<br/>';
}

factorial

Маленькие штучки

Легко сломать просто добавив «обрыв»

<!--?php
$fact = 1;
for($i = 2; $i<100; $i++) {
	$fact *= $i;
	echo $i . ' ' . $fact . '<br/>';
}
exit;

blackfire curl http://my_server.page


и вот мы его поломали, теперь ждем пока загрузится

Сравнение скриптов

Увеличим цель факториала, но уберем вывод… Мы можем увидеть что нагрузка на процессор стала больше, а вот операции «ввода и вывода» меньше. Удельный вес выполнения вырос. Заметим — что дальнейшее внесение функций и объектов на порядок усложняет выполнение (тут до двух секунд, дальше мы увидим и 30 и 40). Профилирование еще дольше длится чем выполнение — так что запускаем заранее допуская что раз в 10 загрузка будет дольше результатов чем генерация самой страницы.

<!--?php
$fact = 1;
for($i = 2; $i<10000000; $i++) {
	$fact *= $i;
 
}
echo 'DONE';

big_cpu

По-разному написанная функция

<!--?php
function fact($fact, $i) {
	return $fact * $i;
}
$fact = 1;
for($i = 2; $i<10000000; $i++) {
	$fact = fact($fact, $i);
}
echo 'DONE';

bad_cpu

Указатель — еще хуже)

<!--?php
function fact(&$fact, $i) {
	$fact *= $i;
}
$fact = 1;
for($i = 2; $i<10000000; $i++) {
	fact($fact, $i);
}
echo 'DONE';

bad_cpu2

Финальный тест

<!--?php
define('END', 100);
 
function fact1($fact, $i) {
	return $fact * $i;
}
function fact2(&$fact, $i) {
	$fact *= $i;
}
class Fact {
	static $f = 1;
	public static function f($i) {
		self::$f *= $i;
	}
}
 
 
function test1() {
	$fact = 1;
	for($i = 2; $i<END; $i++) {
		$fact = fact1($fact, $i);
	}
}
function test2() {
	$fact = 1;
	for($i = 2; $i<END; $i++) {
		fact2($fact, $i);
	}
}
function test3() {
	$fact = 1;
	for($i = 2; $i<END; $i++) {
		$fact *= $i;
	}
}
function test4() {
	for($i = 2; $i<END; $i++) {
		Fact::f($i);
	}
}
 
test1();
echo 'DONE 1<br/>';
 
test2();
echo 'DONE 2<br/>';
 
test3();
echo 'DONE 3<br/>';
 
test4();
echo 'DONE 4<br/>';

bad_tests

О чем говорит график? полный путь загрузок всех функций и объекта, при чем мы сразу видим 4 тест самый тяжелый по выполнению) а самая легкая функция — номер 3 — вообще не в графике, так что можно сделать вывод о показе только нагруженных частей в приоритете нагрузки)

Оставить комментарий

XHTML: Вы можете использовать такие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">