我正在尝试通过计算执行所需的时间(以微秒为单位(来分析一段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)
,您将不会获得微秒。只有毫秒。微沃斯真