测量 PHP 中任何一段代码的执行时间,得到负结果



我正在尝试通过计算执行所需的时间(以微秒为单位(来分析一段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;

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

浮点运算似乎很麻烦,所以我试图尽可能避免它。

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

对我有用的解决方案是将秒部分(消除前导零(进行子串接,并将其连接到部分的末尾。最后,通过乘以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;
}

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

从我的角度来看,接下来会发生。您以"毫秒秒"的形式获得结果,并且仅使用毫秒。当执行时间超过 ~500 毫秒时。结果为阴性

如果您不想使用浮点,请使用下一个方法

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

end_time也是如此。

如果microtime(FALSE),您将不会获得微秒。只有毫秒。微沃斯真

相关内容

最新更新