获得的getrusage(),以测量在C系统的时间(Getting getrusage() to m

2019-06-24 06:51发布

我想测量它需要执行一些代码的系统时间。 要做到这一点,我知道我会说三明治两个电话之间的代码的getrusage(),但我得到一些意想不到的结果...

#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>
#include <stdio.h>

int main() {
  struct rusage usage;
  struct timeval start, end;
  int i, j, k = 0;

  getrusage(RUSAGE_SELF, &usage);
  start = usage.ru_stime;
  for (i = 0; i < 10000; i++) {
    /* Double loop for more interesting results. */
    for (j = 0; j < 10000; j++) {
      k += 20; 
    }
  }
  getrusage(RUSAGE_SELF, &usage);
  end = usage.ru_stime;

  printf("Started at: %ld.%lds\n", start.tv_sec, start.tv_usec);
  printf("Ended at: %ld.%lds\n", end.tv_sec, end.tv_usec);
  return 0;
}

我希望这会产生两个不同的数字,但很可惜! 看到我的电脑想了两秒钟后,这是结果:

Started at: 0.1999s
Ended at: 0.1999s

我不能使用的getrusage()吧? 为什么不应该这两个数字是不同的? 如果我是根本错误的,有另一种方式来使用的getrusage()来衡量的一些源代码的系统时间? 谢谢您的阅读。

Answer 1:

你误会“用户”和“系统”的时间之间的区别。 您的示例代码在用户模式主要执行(即运行你的应用程序代码),而你是测量,但“系统”时间是花费在内核模式(即,处理系统调用)执行时间的措施。

ru_stime是衡量系统时间正确的字段。 测试应用程序只是碰巧不累积你检查这两个点之间的任何这样的时间。



Answer 2:

您应该使用usage.ru_utime ,这是用户使用的CPU时间,来代替。



Answer 3:

使用gprof的。 这会给给你的每个函数所花费的时间。 安装gprof的,并使用这些标志编译-pg -fprofile弧-ftest覆盖。



文章来源: Getting getrusage() to measure system time in C