0

对于以下代码,getrusage 在ru_utime.tv_usec和中返回零ru_utime.tv_sec

代码:

#include "stdlib.h"
#include "stdio.h"
#include "sys/time.h"
#include "sys/resource.h"

int getr_return, who = RUSAGE_SELF;
struct rusage usage;

main()
{
    getr_return = getrusage(who, &usage);
    printf(" getr_return = %d\n", getr_return);

    printf(" time taken in seconds = %.61f\n", usage.ru_utime.tv_sec);
    printf(" time taken in seconds = %.61f\n", usage.ru_utime.tv_usec);


        Some_Mips_consuming_code().


        getr_return = getrusage(who, &usage);
        printf(" getr_return = %d\n", getr_return);

        printf(" time taken in seconds = %.61f\n", usage.ru_utime.tv_sec);
        printf(" time taken in seconds = %.61f\n", usage.ru_utime.tv_usec);

    exit;
 } 

输出:

getr_return = 0
time taken in seconds =  0.0000000000000000000000000000000000000000000000000000000000000
time taken in seconds =  0.0000000000000000000000000000000000000000000000000000000000000
getr_return = 0
time taken in seconds =  0.0000000000000000000000000000000000000000000000000000000000000
time taken in seconds =  0.0000000000000000000000000000000000000000000000000000000000000

编译后的代码Linux version 2.6.18-308

在 ARM 板上运行可执行文件Linux version 3.8.1-2.0

4

2 回答 2

0

在逻辑的两个瞬间之间计算用户使用时间,以找出应该具有 timeval 的开始和结束使用的时间消耗。一些像下面的样本,

 struct timeval start, end;
 getrusage(RUSAGE_SELF, &usage);
 start = usage.ru_utime;
 /* Code to check the usage consumed */
 getrusage(RUSAGE_SELF, &usage);
 end = usage.ru_utime;

ru_utime&ru_stime是类型的结构timeval。如果你看它的声明,两个成员tv_sec&tv_usec都是类型long。因此,在打印时将格式说明符更改为%ld. 请注意何时成功getrusage()返回0

于 2014-03-02T12:24:02.930 回答
0

时间测量在精度、分辨率和准确性方面受到限制。阅读时间(7)。不要期望少于例如半秒的重要计算量度。

通常,CPU 时间测量是通过计算jiffies或定时器中断(与HZ内核中是否有一个相关)来完成的。

由于您在开头调用getrusage(2)main ,因此在它之前没有发生太多计算(基本上,只有main在 eg 中进行预初始化crt0.o)。所以你应该期望它接近于零。

您可以尝试将clock_gettime(2)CLOCK_REALTIMEor一起使用CLOCK_PROCESS_CPUTIME_ID

于 2014-03-02T12:46:07.247 回答