Как для сравнительного анализа эффективности PHP скрипт


Я хочу знать, что это лучший способ проверить мои PHP скрипты. Не имеет значения, является ли задание cron, веб-страница или веб-служба.

Я знаю, что могу использовать microtime, но действительно ли это дает мне Реальное время PHP-скрипта?

Я хочу протестировать и проверить различные функции в PHP, которые делают то же самое. Например, preg_match vs strpos или domdocument vs preg_match или preg_replace vs str_replace'

пример web-страницы:

<?php
// login.php

$start_time = microtime(TRUE);

session_start(); 
// do all my logic etc...

$end_time = microtime(TRUE);

echo $end_time - $start_time;

этот будет выводить: 0.0146126717 (меняется все время - но это последний, который я получил). Это означает, что для выполнения PHP-скрипта потребовалось 0.015 или около того.

есть ли лучший способ?

9 115

9 ответов:

Если вы действительно хотите проверить реальный код мира, используйте такие инструменты, как Xdebug и XHProf.

Xdebug отлично подходит для работы в dev/staging, а XHProf-отличный инструмент для производства, и его можно безопасно запускать там (пока вы читаете инструкции). Результаты любой загрузки одной страницы не будут такими же актуальными, как просмотр того, как работает ваш код, в то время как сервер получает удар, чтобы сделать миллион других вещей, а также и ресурсы становятся дефицитными. Это вызывает еще один вопрос: вы узкое место на CPU? Оперативной памяти? I / O?

Вам также нужно смотреть не только на код, который вы запускаете в своих скриптах, но и на то, как обслуживаются ваши скрипты/страницы. Какой веб-сервер вы используете? Например, я могу заставить nginx + PHP-FPM серьезно выполнять mod_php + Apache, который, в свою очередь, получает trunched для обслуживания статического контента с помощью хорошего CDN.

следующее, что нужно учитывать, это то, что вы пытаетесь оптимизировать за что?

  • - это скорость, с которой страница отображается в браузере пользователей приоритет номер один?
  • получает каждый запрос на сервер выбрасывается обратно так же быстро, как возможно с наименьшим потреблением процессора цель?

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

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

чтобы проверить, как быстро ваш полный скрипт работает на сервере, есть много инструментов, которые вы можете использовать. Сначала убедитесь, что ваш скрипт (например, preg_match vs strpos) должен выводить те же результаты, чтобы квалифицировать ваш тест.

вы можете использовать:

вы хотите посмотреть Xdebug и, более конкретно, возможности профилирования Xdebug.

В принципе, вы включаете профилировщик, и каждый раз, когда вы загружаете веб-страницу, он создает файл cachegrind, который можно прочитать с помощью WinCacheGrind или KCacheGrind.

Xdebug может быть немного сложно настроить, поэтому вот соответствующий раздел my php.ini для справки:

[XDebug]
zend_extension = h:\xampp\php\ext\php_xdebug-2.1.1-5.3-vc6.dll
xdebug.remote_enable=true
xdebug.profiler_enable_trigger=1
xdebug.profiler_output_dir=h:\xampp\cachegrind
xdebug.profiler_output_name=callgrind.%t_%R.out

а вот это скриншоты на WinCacheGrind:

enter image description here

Это должно предоставить достаточно подробную информацию о том, насколько эффективен ваш PHP-скрипт. Вы хотите нацелиться на то, что занимает наибольшее количество времени. Например, вы можете оптимизировать одну функцию, чтобы занять половину времени, но ваши усилия будут лучше служить оптимизации функции, которая вызывается десятки, если не сотни раз во время загрузки страницы.

Если вам интересно, это просто старая версия CMS, которую я написал для собственного использования.

попробуйте https://github.com/fotuzlab/appgati

Это позволяет определить действия в код и сообщает время, использование памяти, нагрузка на сервер и т. д. Между двумя шагами.

что-то типа:

    $appgati->Step('1');

    // Do some code ...

    $appgati->Step('2');

    $report = $appgati->Report('1', '2');
    print_r($report);

пример вывода массива:

Array
(
    [Clock time in seconds] => 1.9502429962158
    [Time taken in User Mode in seconds] => 0.632039
    [Time taken in System Mode in seconds] => 0.024001
    [Total time taken in Kernel in seconds] => 0.65604
    [Memory limit in MB] => 128
    [Memory usage in MB] => 18.237907409668
    [Peak memory usage in MB] => 19.579357147217
    [Average server load in last minute] => 0.47
    [Maximum resident shared size in KB] => 44900
    [Integral shared memory size] => 0
    [Integral unshared data size] => 0
    [Integral unshared stack size] => 
    [Number of page reclaims] => 12102
    [Number of page faults] => 6
    [Number of block input operations] => 192
    [Number of block output operations] => 
    [Number of messages sent] => 0
    [Number of messages received] => 0
    [Number of signals received] => 0
    [Number of voluntary context switches] => 606
    [Number of involuntary context switches] => 99
)

Я бы заглянул в xhprof. Не имеет значения, работает ли он на cli или через другой sapi (например, fpm или fcgi или даже модуль Apache).

лучшая часть о xhprof заключается в том, что он даже достаточно подходит для запуска в производство. Что-то, что не работает также с xdebug (последний раз, когда я проверял). xdebug влияет на производительность, а xhprof (я бы не сказал, что его нет) управляет намного лучше.

мы часто используем xhprof для того чтобы собрать образцы с реальным трафик, а затем проанализировать код оттуда.

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

после компиляции и загрузки расширения вы начинаете профилирование в коде с помощью:

xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

остановить:

$xhprof_data = xhprof_disable();

затем сохраните данные файл или база данных - все, что плавает в вашей лодке и не вмешивается в обычную среду выполнения. Мы асинхронно нажимаем это на S3 для централизации данных (чтобы иметь возможность видеть все запуски со всех наших серверов).

The код на github содержит папку xhprof_html, которую вы сбрасываете на сервер и с минимальной конфигурацией, вы можете визуализировать собранные данные и начать детализацию.

НТН!

положите его в for петли, чтобы сделать каждую вещь 1000000 раз, чтобы получить более реалистичное число. И только запустите таймер непосредственно перед кодом, который вы действительно хотите проверить, а затем запишите время окончания сразу после (т. е. не запускайте таймер до session_start().

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

Как выполняется скрипт (cronjob, php из командной строки, Apache, так далее.) не должно иметь значения, так как вы только синхронизируете относительную разницу между скоростью различных функций. Так что это соотношение должно остаться прежним.

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

хорошим началом является использование xdebugs profiler http://xdebug.org/docs/profiler

может быть, не самая простая вещь для настройки и использования, но как только вы ее получите, огромные объемы данных и простота просмотра незаменимы.

Эрик

вы задаете себе неправильный вопрос. Если ваш скрипт выполняется в ~15 мс, то его время в значительной степени не имеет значения. Если вы работаете на общей службе, то активация образа PHP займет ~100 мс, чтение файлов сценариев ~30-50 МС, если они полностью кэшируются на сервере, возможно, 1 или более секунд, если они загружаются из серверной фермы NAS. Сетевые задержки при загрузке страницы мебель может добавить много секунд.

основная проблема здесь-пользователи восприятие времени загрузки: как долго он должен ждать между щелчком по ссылке и получением полностью визуализированной страницы. Взгляните на Скорость Страницы Google который вы можете использовать в качестве расширения Ff или chrome, а также документацию Pagespeed, в которой подробно обсуждается, как получить хорошую производительность страницы. Следуйте этим рекомендациям и попытайтесь получить свои оценки страницы лучше, чем 90/100. (Домашняя страница google набирает 99/100 баллов, как и мой блог). Это лучший способ получить хорошее восприятие пользователем спектакль.

Это также хорошо, чтобы держать глаза на ваш PHP-код и перепроверить с этой ссылке, чтобы убедиться, что ваше кодирование само по себе не нарушает производительность приложения.