测量 PHP 中任意一段代码的执行时间,得到否定结果

Measuring the execution time of any piece of code in PHP, getting negative result

我正在尝试通过计算执行代码所需的时间(以微秒为单位)来剖析 php 代码片段。我创建了一个探查器函数,它将另一个函数作为参数,如下所示

function profiler($funct) 
{
    $raw_start_time = microtime();
    $funct();
    $raw_end_time = microtime();

    $start_time = 1000000 * (double) explode(" ", $raw_start_time)[0];
    $end_time = 1000000 * (double) explode(" ", $raw_end_time)[0];

    return $end_time - $start_time;
}

我这样使用 profiler() 函数

$duration = profiler(function() {
                //code i want to profile
            });

echo $duration;

该函数大多数时间都正确运行,returns 正确的执行持续时间。但是,我在某些测试用例中得到负值。可能是什么问题?

microtime ([ bool $get_as_float = FALSE ] ) : mixed 尝试将其设置为 TRUE

从我的角度来看接下来会发生什么。您将以 "msec sec" 形式获得结果,并且仅使用毫秒。当执行时间超过 ~500 毫秒。结果是否定的

如果你不想使用 float 而不是使用 next 方法

$start_time = explode(" ", $raw_start_time)[1] * 1000 + explode(" ", $raw_start_time)[0];

与 end_time 相同。

如果 microtime(FALSE) 你不会得到微秒。只有毫秒。微分值 TRUE

浮点运算似乎是hassle,所以我尽量避免它。

OP 代码的问题是只使用了结果的 微秒 部分。因此,如果执行持续时间超过一秒,最终结果可能是负差异。

对我有用的解决方案是对 microseconds 部分进行子字符串化(以消除前导零)并将其连接到 seconds 部分。最后,通过乘以 1000000.

,所有内容都转换为 微秒
function profiler($funct) 
{
    $raw_start_time = microtime();
    $funct();
    $raw_end_time = microtime();

    $array_start_time = explode(" ", $raw_start_time);
    $start_time = (int) (1000000 * (double) implode("", [$array_start_time[1], substr($array_start_time[0], 1, 8)]));

    $array_end_time = explode(" ", $raw_end_time);
    $end_time = (int) (1000000 * (double) implode("", [$array_end_time[1], substr($array_end_time[0], 1, 8)]));

    return $end_time - $start_time;
}