如何获得PHP中实际使用的CPU时间?

问题描述 投票:3回答:2

如何计算我的php脚本实际使用的CPU时间?

请注意,这不是我想要的。

<?php
$begin_time=microtime(true);
//..
//end of the script:
$total_time=microtime(true)-$begin_time;

因为这将会给我已耗费的时间,这可能包括很多不相关进程使用的时间。这可能包括很多同时运行的不相关进程使用的时间,以及等待io的时间。

我看到有getrusage(),但文档页的用户评论说。

getrusage()报告的是内核计数器,这些计数器只有在应用程序失去上下文和切换到内核空间时才会更新。例如,在现代Linux服务器内核上,这意味着getrusage()调用将以10ms的速度返回信息,桌面内核--以1ms的速度返回信息。

getrusage()根本无法用于微观测量--而getmicrotime(true)可能是更有价值的资源。

所以这似乎不是一个选择,是吗?

我有什么其他选择?

php cpu-usage
2个回答
1
投票

定义 "你的 "IO. 从技术上讲,将内存移动到cpu寄存器是IO。你是说你想从你的计算中删除这些时间? (我猜不是)

我想说的是,你很可能是想用某种方式来描述你的代码。如果你想测量没有花在读写文件或网络套接字上的时间,只需使用microtime并在做IO的部分周围加上额外的调用。这样你也会知道你的IO占用了多少时间。更有可能的是,你会发现你有一些循环所花费的时间比你预期的要多。

当我进行这样的剖析时,我要么使用eclipse中的剖析工具,要么使用时间记录器,并在代码中插入一些类似二进制搜索的时间记录。通常我都会找到一些小区域的代码,这些代码占用了85%的测量时间,然后在那里做优化。

还有一点,不要让完美成为实用的敌人。在你的过程中,90%的时间你的调用不会被其他进程打断,你的微时间计算也会足够接近。


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;

资料来源:《/helpdesk.nodehost.caenarticlehow-to-calculatreal-cpu-usagin-a-php-script-o3ceu8》。https:/helpdesk.nodehost.caenarticlehow-to-calculate-real-cpu-usag-in-a-php-script-o3ceu8。

© www.soinside.com 2019 - 2024. All rights reserved.