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
相关产品推荐
相关产品推荐

