PHP getrusage()返回错误的信息?

我正在尝试确定
PHP脚本的CPU使用率.我刚刚找到
this article,详细说明了如何查找系统和用户CPU使用时间(第4节).

但是,当我尝试这些例子时,我收到了完全不同的结果.

第一个例子:

sleep(3);

$data = getrusage();
echo "User time: ".
    ($data['ru_utime.tv_sec'] +
    $data['ru_utime.tv_usec'] / 1000000);
echo "System time: ".
    ($data['ru_stime.tv_sec'] +
    $data['ru_stime.tv_usec'] / 1000000);

结果是:

User time: 29.53
System time: 2.71

例2:

for($i=0;$i<10000000;$i++) {

}

// Same echo statements

结果:

User time: 16.69
System time: 2.1

例3:

$start = microtime(true);  
while(microtime(true) - $start < 3) {  

}  

// Same echo statements

结果:

User time: 34.94
System time: 3.14

显然,除了第三个例子中的系统时间之外,没有一个信息是正确的.那么我做错了什么?我真的希望能够使用这些信息,但它需要可靠.

我正在使用Ubuntu Server 8.04 LTS(32位),这是php -v的输出:

PHP 5.2.4-2ubuntu5.10 with Suhosin-Patch 0.9.6.2 (cli) (built: Jan  6 2010 22:01:14)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies

最佳答案 您可以使用系统’time’命令从外部验证此信息:

/usr/bin/time php script.php

这将打印如下:

0.03user 0.00system 0:03.04elapsed 0%CPU (0avgtext+0avgdata 32752maxresident)k
0inputs+0outputs (0major+2234minor)pagefaults 0swaps

当然,不要忘记getrusage()信息是使用的CPU时间,microtime()是挂钟时间.该程序可能会根据墙上的时钟运行10分钟,但内部可能只使用几秒钟的CPU时间.然后,在系统上运行的所有后台程序,资源争用以及常规内务处理争夺CPU时间.

能够在如此短的时间内获得准确的时间安排涉及太多因素.做了三次运行while(microtime())版本的循环,我得到了以下时间:

user:0.98,0.09,0.90
sys:0.12,0.05,0.94

显然差异很大.即使只是一个简单的<? print_r(getrusage())?> utime / stimes的范围从0到0.03.

尝试运行您的循环更长时间,并在其中执行一些操作以增加CPU使用率.现在你的数字太小而无法准确测量.

点赞