在C和linux下测量时间

我想看看C程序有多less,所以我写道:

#include<stdio.h> #include<stdlib.h> #include"memory.h" #include"memory_debug.h" #include<sys/times.h> #include<unistd.h> int (*deallocate_ptr)(memContainer *,void*); void (*merge_ptr)(node *); void* (*allocate_ptr)(memContainer *,unsigned long size); memContainer* (*init_ptr)(unsigned long ); diagStruct* (*diagnose_ptr)(memContainer *); void (*finalize_ptr)(memContainer *); void (*printNode_ptr)(node *n); void (*printContainer_ptr)(memContainer *c); void info(memContainer *c) { struct tms *t; t=malloc(sizeof(struct tms)); times(t); printf("user : %d\nsystem : %d\n %d",t->tms_utime,(int)t->tms_stime); diagnose_ptr(c); printf("\n"); return ; } 

但是当我调用这个函数,我得到0个用户时间和0个系统时间,即使我写:

 for (i=0;i<100000;++i) for (j=0;j<10;++j) {} info(c); 

我究竟做错了什么?

下面的演示程序输出非零时间:

 #include<stdio.h> #include<stdlib.h> #include"memory.h" #include<sys/times.h> #include<unistd.h> #include <iostream> using namespace std; int main() { int x = 0; for (int i = 0; i < 1 << 30; i++) x++; struct tms t; times(&t); cout << t.tms_utime << endl; cout << t.tms_stime << endl; return x; } 

输出:

 275 1 

编译器可能会优化你的for循环,因为它们什么都不做。 尝试增加一个volatile变量。

如果您只想知道时间,请尝试运行time ./app ,它将打印执行的应用程序的cputime,挂钟时间等。

代码可以在开始时简单地写一个volatile变量,把你的'work'放在一个函数中(在一个单独的文件中),然后在'work'之后读取volatile并打印涉及volatile东西。

或者做一些简单的计算,将一部分计算隐藏在函数中,或者使用函数返回。

你在使用什么平台(操作系统和编译器)?

我不知道你正在运行的是什么平台,但是关于更高精度系统时钟的stackoverflow有几个有用的问题。 Linux中用户空间的高精度时序有几个有用的链接和引用。

在Linux下C ++的时序方法看起来很有用。