测量 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;
}
我正在尝试通过计算执行代码所需的时间(以微秒为单位)来剖析 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;
}