Измерение скорости выполнения php скрипта
Хочу потестировать большинство функций WP (и не только), которые взаимозаменяемы.
Правда, столкнулся с проблемой. В интернете предлагают замерять с помощью микройтайм, взял я код. На голом php - полёт нормальный. Вставляю в WP (в хедер и в футер) - выдает баснословное количество секунд. Подскажи, как грамотнее всего замерять скорость выполнения (работы) скрипта PHP или отдельных функций.
Нужна проверка скорости выполнения кода.
Буду рад протестировать и предоставить результаты. Нужно только понять как можно быстро и правильно замерить время выполнения указанного PHP кода.
Иногда бывает нужно замерить время выполнения отельного куска кода в PHP. Сделать это не сложно, ниже разберемся как.
Простой вариант
Замерить скорость выполнения какой-то отдельной его части PHP кода, можно с помощью встроенной в PHP функции
microtime( true ). Функция вернет UNIX штамп времени в микросекундах. Параметр true говорит функции вернуть число, а не строку, чтобы можно было потом просто отнять одно число от другого.Логика проста: сначала замеряем текущее время в микросекундах, выполняем код, опять замеряем текущее время и высчитываем разницу времени - эта разница и будет временем выполнения кода. С помощью функции
sprintf()форматируем результат в более читаемый формат.Вариант посложнее, но с доп функциональностью
Для измерения скорости работы PHP кода, когда-то написал такую функцию:
/** * Считает время выполнения PHP кода (в секундах). * * exec_time(); * // код * echo exec_time('get') .' сек.'; //> 0.03654 сек. * * @version 3.4.5 * * @param string $phase run - включает подсчет: первый раз или после паузы (по умолчанию). * start - очищает все кэши и включает подсчет - clear & run. * get - получает разницу, между предыдущим вызовом функции. * getall|end|stop - получает разницу, между первым вызовом функции (run). * pause - временная остановка подсчета. exec_time() для продолжения. * clear - полностью очищает результат. exec_time() для начала нового подсчета. * @param int $round До скольки знаков после запятой округлять результат. * * @return float|void Example 0.03654 */ function exec_time( $phase = 'run', $round = 6 ){ static $prev_time, $collect; if( 'start' === $phase ){ $collect = $prev_time = 0; } elseif( 'clear' === $phase ){ return $collect = $prev_time = 0; } list( $usec, $sec ) = explode( ' ', microtime() ); $mctime = bcadd( $usec, $sec, 8 ); if( $prev_time ){ $exectime = $mctime - $prev_time; // bcsub( $mctime, $prev_time, 8 ); $collect += $exectime; // bcadd( $collect, $exectime, 8 ); } $prev_time = $mctime; if( 'pause' === $phase ){ $prev_time = 0; } elseif( 'get' === $phase ){ return round( $exectime, $round ); } elseif( false !== strpos( 'getall end stop', $phase ) ){ return round( $collect, $round ); } }Если замеряете отдельные быстрые функции, например: __(), то можно повторять выполнение для наглядности. Например, замерим работу
__():exec_time(); for( $i=1; $i<50000; $i++ ){ $r = __( 'Settings', 'default' ); } echo exec_time('get') .'сек.'; // 0.51650 сек.--
Смотрите также, функции подсчета времени выполнения кода в WP:
П.С. Жду результатов тестов на этом сайте
Спасибо большое
Обязательно буду делиться, вот только куда выкладывать? И ещё ма-а-а-аленький вопросик: а память каким образом можно замерять? Для оптимизации, думаю, тоже немаловажный вопрос.
Насчет памяти точно не знаю, надо разобраться с этим... Сейчас немного не до этого. Но я буду иметь ввиду этот вопрос, чуть что отвечу здесь.