我想看看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 ++的时序方法看起来很有用。