Время от времени я хотел бы иметь возможность измерять прошедшее время между двумя сегментами кода. Это исключительно для того, чтобы обнаружить узкие места в коде и улучшить то, что можно улучшить.
Я хотел бы создать такую функцию, в которой функция должна работать с глобальной переменной, которая отгоняет прошедшее время между текущим вызовом и в последний раз, когда он был вызван.
Таким образом, вы можете использовать его много раз один за другим.
И функция должна быть способна вычислять различия в доли секунды, такие как 0,1 с или 0,3 сек и т. Д.
Пример, вероятно, объяснит это намного лучше.
echo time_elapsed(); // This echo outputs nothing cause this is the starting case. // There is nothing to compare against. // // 1st code section here // echo time_elapsed(); // This echo outputs 0.5 seconds. // ...which means there has been 0.5 seconds passed // ...since the last time time_elapsed() was fired // // 2nd code section here // echo time_elapsed() // This echo outputs 0.2 seconds // // 3rd code section here // echo time_elapsed() // This echo outputs 0.1 seconds etc
Мой вопрос: какие утилит PHP (встроенные функции) мне нужно использовать для достижения такого вида вывода?
Отладчик, такой как XDebug / Zend Debugger, может дать вам этот вид понимания (и многое другое), но вот подсказка о том, как вы можете написать такую функцию:
function time_elapsed() { static $last = null; $now = microtime(true); if ($last != null) { echo '<!-- ' . ($now - $last) . ' -->'; } $last = $now; }
В основном функция microtime () – это все, что вам нужно для выполнения вычислений времени. Чтобы избежать глобальной переменной, я использую статическую переменную в рамках прошедшей функции. Кроме того, вы можете создать простой класс, который может инкапсулировать требуемые переменные и вызвать вызовы методу класса для отслеживания и вывода значений времени.
Из первого примера в php doc s :
<?php /** * Simple function to replicate PHP 5 behaviour */ function microtime_float() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } $time_start = microtime_float(); // Sleep for a while usleep(100); $time_end = microtime_float(); $time = $time_end - $time_start; echo "Did nothing in $time seconds\n";
Что-то в этом направлении должно работать:
$start = microtime(true); // Do something sleep(2); $end = (microtime(true) - $start); echo "elapsed time: $end";
Другие факторы влияют на время ваших сценариев. Пример:
Такая же функция drew010 (спасибо!), Только добавленные пользовательские комментарии и отображения времени в микросекундах (нас):
function time_elapsed($comment) { static $time_elapsed_last = null; static $time_elapsed_start = null; // $unit="s"; $scale=1000000; // output in seconds // $unit="ms"; $scale=1000; // output in milliseconds $unit="μs"; $scale=1; // output in microseconds $now = microtime(true); if ($time_elapsed_last != null) { echo "\n"; echo '<!-- '; echo "$comment: Time elapsed: "; echo round(($now - $time_elapsed_last)*1000000)/$scale; echo " $unit, total time: "; echo round(($now - $time_elapsed_start)*1000000)/$scale; echo " $unit -->"; echo "\n"; } else { $time_elapsed_start=$now; } $time_elapsed_last = $now; }
вfunction time_elapsed($comment) { static $time_elapsed_last = null; static $time_elapsed_start = null; // $unit="s"; $scale=1000000; // output in seconds // $unit="ms"; $scale=1000; // output in milliseconds $unit="μs"; $scale=1; // output in microseconds $now = microtime(true); if ($time_elapsed_last != null) { echo "\n"; echo '<!-- '; echo "$comment: Time elapsed: "; echo round(($now - $time_elapsed_last)*1000000)/$scale; echo " $unit, total time: "; echo round(($now - $time_elapsed_start)*1000000)/$scale; echo " $unit -->"; echo "\n"; } else { $time_elapsed_start=$now; } $time_elapsed_last = $now; }
Пример:
// Start timer time_elapsed(''); // Do something usleep(100); time_elapsed('Now awake, sleep again'); // Do something usleep(100); time_elapsed('Game over');
Ouput:
<!-- Now awake, sleep again: Time elapsed: 100 us, total time: 100 us --> <!-- Game over: Time elapsed: 100 us, total time: 200 us -->
<?php $time_start = microtime(true); // Sleep for a while (or your code which you want to measure) usleep(100); $time_end = microtime(true); $time = $time_end - $time_start; echo "Did nothing in $time seconds\n";
Источник: http://php.net/manual/en/function.microtime.php#example-2568