PHP microtime() верен?

Я использовал microtime() для проверки времени выполнения кода. Но это кажется очень странным, так как время отслеживается неправильно.

Итак, в моем test.php у меня есть следующий код:

$debug = true; 
$start = microtime(true); 
$newline = "<br/>";

...

if ($debug) {
    $time_elapsed_secs = microtime(true) - $start;
    $start = microtime(true);
    echo 'Step 1 Done: ' . $time_elapsed_secs . $newline; }

...

if ($debug) {
    $time_elapsed_secs = microtime(true) - $start;
    $start = microtime(true);
    echo 'Step 2 Done: ' . $time_elapsed_secs . $newline; }

Затем, когда я открываю URL-адрес в браузере, он отвечает менее чем за 1 секунду, но показывает что-то странное, например Шаг 1 выполнен: 0,0026565 Шаг 2 выполнен: 9,8646454

Как это могло случиться? Я делаю что-то не так?


person Codemole    schedule 13.10.2015    source источник
comment
Шаг 1 Готово: 0,0026565 означает, что для достижения этой точки потребовалось 0,0026565 секунд. Шаг 2 Готово: 9,8646454 означает, что для достижения этой точки потребовалось 9,8646454 секунды.   -  person samlev    schedule 13.10.2015


Ответы (2)


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

Step 1 Done: 0.0026565
...
Step 2 Done: 9.8646454E-5

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

$debug = true; 
$start = microtime(true); 
$newline = "<br/>";

usleep(30);

if ($debug) {
    $time_elapsed_secs = microtime(true) - $start;
    $start = microtime(true);
    echo 'Step 1 Done: ' . sprintf( '%f', $time_elapsed_secs ) . $newline; }

usleep(1);

if ($debug) {
    $time_elapsed_secs = microtime(true) - $start;
    $start = microtime(true);
    echo 'Step 2 Done: ' . sprintf( '%f', $time_elapsed_secs ) . $newline; }

[Примечание: добавлены вызовы usleep(), чтобы показать, что что-то происходит.]

person BA_Webimax    schedule 13.10.2015

Это зависит от того, что делает код между двумя шагами. Закомментируйте код между двумя шагами и (но вы правы, странно, если страница возвращается менее чем за 1 секунду..)

// Sleep for a while
usleep(100);

Проверьте, измеряет ли микровремя правильную дельту времени.

person C1sc0    schedule 13.10.2015
comment
было моей ошибкой не проверить значение правильно. :-) - person Codemole; 14.10.2015