Вам необходимо использовать microtime
для начальных / конечных значений и только отформатировать его для отображения в конце.
// Get the start time in microseconds, as a float value
$starttime = microtime(true);
/************/
/* Do stuff */
/************/
// Get the difference between start and end in microseconds, as a float value
$diff = microtime(true) - $starttime;
// Break the difference into seconds and microseconds
$sec = intval($diff);
$micro = $diff - $sec;
// Format the result as you want it
// $final will contain something like "00:00:02.452"
$final = strftime('%T', mktime(0, 0, $sec)) . str_replace('0.', '.', sprintf('%.3f', $micro));
Примечание: это возвращает значения с плавающей точкой из microtime
и использует арифметику с плавающей точкой, чтобы упростить математику, поэтому ваши числа могут быть очень незначительными из-за проблемы округления с плавающей точкой, но вы округляете результат до 3 цифр в конце концов, в любом случае, и небольшие колебания тактовой частоты процессора больше, чем ошибки с плавающей запятой, так что это не проблема для вас на нескольких уровнях.