使用C获取getrusage()以测量系统时间

使用C获取getrusage()以测量系统时间,c,time,systemtime,getrusage,C,Time,Systemtime,Getrusage,我想测量执行某些代码所需的系统时间。要做到这一点,我知道我会在两次调用getrusage()之间夹住所说的代码,但我得到了一些意想不到的结果 #include <sys/time.h> #include <sys/resource.h> #include <unistd.h> #include <stdio.h> int main() { struct rusage usage; struct timeval start, end;

我想测量执行某些代码所需的系统时间。要做到这一点,我知道我会在两次调用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;
}

我没有使用getrusage()对吗?为什么这两个数字不应该不同?如果我根本错了,是否有其他方法可以使用getrusage()来测量某些源代码的系统时间?感谢阅读。

您应该使用
用法.ru_utime
,这是用户使用的CPU时间。

使用gprof。这将为您提供每个函数所用的时间。
安装gprof并使用以下标志进行编译:
-pg-fprofile arcs-ftest coverage.
您误解了“用户”和“系统”时间之间的差异。在测量时,示例代码主要在用户模式下执行(即运行应用程序代码),但“系统”时间是在内核模式下执行(即处理系统调用)所花费时间的度量


ru_stime
是测量系统时间的正确字段。您的测试应用程序恰好没有在您检查的两点之间累积任何这样的时间。

这确实给了我更好的结果。然而,我仍然有义务找到一种工作方式来测量某些代码的系统时间。如果usage.ru_stime不工作,它有什么用?如果程序设计为在内核模式下运行,则使用
ru_stime
。否则,请使用
ru\u utime
。谢谢!你比我的教授解释得更好。请注意,
tv\u usec
是微秒,所以你的格式应该是
%lu.%06u
Started at: 0.1999s
Ended at: 0.1999s