如何计算php脚本实际使用的CPU时间?
请注意,这不是我想要的:
<?php
$begin_time=microtime(true);
//..
//end of the script:
$total_time=microtime(true)-$begin_time;
因为那会给我时间流逝。这可能包括同时运行的无关进程使用的大量时间,以及等待i / o所花费的时间。
我见过有getrusage(),但文档页面中的用户评论说:
getrusage()报告仅在应用程序丢失上下文并切换到内核空间时才更新的内核计数器。例如,在现代Linux服务器内核上,这意味着getrusage()调用将返回以10ms舍入的信息,桌面内核 - 以1ms为单位。
getrusage()根本不能用于微观测量 - 而getmicrotime(真实)可能是更有价值的资源。
所以这似乎不是一个选择,是吗?
我有哪些替代方案?
答案 0 :(得分:1)
定义“您的”I / O.从技术上讲,内存移动到cpu寄存器是I / O.您是说要从计算中删除该时间? (我猜不是)
我得到的是您希望以某种方式分析您的代码。如果您想测量不读/写文件或网络套接字的时间,只需使用microtime并对执行I / O的部分进行额外调用。然后,您还将了解I / O所花费的时间。更有可能你会发现你有一些循环比你期望的更多的时间。
当我这样描述时,我要么在eclipse中使用性能分析工具,要么使用时间记录器并进行某种二进制搜索 - 插入时间记录到代码中。通常我会发现一小部分代码需要85%的测量时间并在那里进行优化。
另外作为旁注,不要让完美成为实用的敌人。在您的过程中,90%的时间您的电话不会被其他一些过程中断,您的微量电话计数将足够接近。答案 1 :(得分:0)
您可以使用getrusage()
完整示例:
<?php
function rutime($ru, $rus, $index){
return ($ru["ru_$index.tv_sec"]*1000 + intval($ru["ru_$index.tv_usec"]/1000))
- ($rus["ru_$index.tv_sec"]*1000 + intval($rus["ru_$index.tv_usec"]/1000));
}
$cpu_before = getrusage();
$ms = microtime(true) * 1000;
sleep(3);
$tab = [];
for($i = 0; $i < 500000; $i++) {
$tab[] = $i;
}
$cpu_after = getrusage();
echo "Took ".rutime($cpu_after, $cpu_before, "utime")." ms CPU usage" . PHP_EOL;
echo "Took ".((microtime(true) * 1000) - $ms)." ms total". PHP_EOL;
来源:https://helpdesk.nodehost.ca/en/article/how-to-calculate-real-cpu-usage-in-a-php-script-o3ceu8/