You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

microtime()函数能否可靠统计PHP脚本CPU耗时?CPU切换是否影响其差值?

关于PHP中microtime()与CPU耗时统计的问题

咱们直接拆解你的两个核心问题:

1. microtime()是否是统计整个PHP脚本CPU耗时的可靠方式?

答案是否定的。

默认情况下,microtime()(尤其是使用microtime(true)获取浮点数时间戳时)返回的是墙上时间(wall-clock time)——也就是从脚本启动到结束,实际流逝的真实时间。这个时间包含了大量脚本本身不占用CPU的片段:比如磁盘IO等待、网络请求耗时、CPU被调度去执行其他进程/线程的时间,甚至是系统空闲的时间。

如果你要统计的是脚本真正占用CPU的时间(即CPU花在执行该脚本用户态和内核态指令上的时长),microtime()完全不可靠。这时你应该用PHP内置的getrusage()函数,它能获取当前进程的资源使用详情,其中就包含精确的CPU耗时统计。

给你做个代码对比更直观:

用microtime()统计墙上时间

$startWallTime = microtime(true);
// 模拟包含等待操作的脚本逻辑
sleep(1); // 这段时间CPU根本没在跑脚本
$endWallTime = microtime(true);
echo "总流逝时间:" . ($endWallTime - $startWallTime) . "秒";
// 输出会接近1秒,但这不是CPU耗时

用getrusage()统计CPU耗时

$startUsage = getrusage();
sleep(1); // 同样的等待操作
$endUsage = getrusage();

// 计算用户态CPU时间(转换为秒)
$userCpu = ($endUsage['ru_utime.tv_sec'] - $startUsage['ru_utime.tv_sec']) + 
           ($endUsage['ru_utime.tv_usec'] - $startUsage['ru_utime.tv_usec']) / 1000000;

// 计算内核态CPU时间(转换为秒)
$systemCpu = ($endUsage['ru_stime.tv_sec'] - $startUsage['ru_stime.tv_sec']) + 
             ($endUsage['ru_stime.tv_usec'] - $startUsage['ru_stime.tv_usec']) / 1000000;

$totalCpuTime = $userCpu + $systemCpu;
echo "CPU实际耗时:" . $totalCpuTime . "秒";
// 输出会接近0秒,因为sleep期间CPU没执行这个脚本的任何指令

2. CPU切换至其他任务会影响microtime()的差值吗?

肯定会。

正如前面所说,microtime()统计的是真实时间差。如果脚本执行中途,操作系统把CPU调度去处理其他任务(比如另一个进程、系统服务),这段被占用的时间会被完整计入首尾两次microtime()的差值里。

举个例子:你的脚本本身执行CPU操作只需要0.1秒,但中途CPU被切走处理其他任务花了0.5秒,那么microtime()的差值会是0.6秒左右——这个数值远大于脚本实际占用CPU的时间。而如果用getrusage()统计,得到的CPU耗时还是接近0.1秒,因为那0.5秒CPU没在跑你的脚本。

总结

  • 若要统计脚本从启动到结束的总耗时(包括所有等待时间):microtime()是可靠的,但它不代表CPU耗时。
  • 若要统计脚本真正占用CPU的时间:别用microtime(),改用getrusage()更准确。

内容的提问来源于stack exchange,提问作者John Law

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:18:40