WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

Измерение скорости выполнения php скрипта

Хочу потестировать большинство функций WP (и не только), которые взаимозаменяемы.

Правда, столкнулся с проблемой. В интернете предлагают замерять с помощью микройтайм, взял я код. На голом php - полёт нормальный. Вставляю в WP (в хедер и в футер) - выдает баснословное количество секунд. Подскажи, как грамотнее всего замерять скорость выполнения (работы) скрипта PHP или отдельных функций.

Нужна проверка скорости выполнения кода.

Буду рад протестировать и предоставить результаты. Нужно только понять как можно быстро и правильно замерить время выполнения указанного PHP кода.

2
campusboy
7.4 года назад 4055
  • 3
    Kama8761

    Иногда бывает нужно замерить время выполнения отельного куска кода в PHP. Сделать это не сложно, ниже разберемся как.

    Простой вариант

    Замерить скорость выполнения какой-то отдельной его части PHP кода, можно с помощью встроенной в PHP функции microtime( true ). Функция вернет UNIX штамп времени в микросекундах. Параметр true говорит функции вернуть число, а не строку, чтобы можно было потом просто отнять одно число от другого.

    Логика проста: сначала замеряем текущее время в микросекундах, выполняем код, опять замеряем текущее время и высчитываем разницу времени - эта разница и будет временем выполнения кода. С помощью функции sprintf() форматируем результат в более читаемый формат.

    $start = microtime( true );
    
    get_bloginfo( 'homeurl' ); // какой-то код
    
    $diff = microtime( true ) - $start;
    $diff = sprintf( '%.6F sec.', $diff );
    
    echo "Время выполнения: $diff"; // Время выполнения: 0.000014 sec.

    Вариант посложнее

    Для измерения скорости работы 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:

    П.С. Жду результатов тестов на этом сайте smile

    campusboy 7.4 года назад

    Спасибо большое smile Обязательно буду делиться, вот только куда выкладывать? И ещё ма-а-а-аленький вопросик: а память каким образом можно замерять? Для оптимизации, думаю, тоже немаловажный вопрос.

    Kama 7.3 года назад

    Насчет памяти точно не знаю, надо разобраться с этим... Сейчас немного не до этого. Но я буду иметь ввиду этот вопрос, чуть что отвечу здесь.

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация