用C和linux测量时间

时间:2012-03-24 23:31:16

标签: c linux

我想知道C程序花了多少钱,所以我写道:

  #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); 

我做错了什么?

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

代码可以在开始时简单地编写一个volatile变量,让您的工作变为“工作”。在一个函数中(在一个单独的文件中),然后在&#39; work&#39;之后阅读volatile。并打印涉及volatile的内容。

或者使用函数的一部分计算进行一些简单的计算,或者使用函数return。

您使用的是什么平台(操作系统和编译器)?

我不知道你正在运行什么平台,但有关高精度系统时钟的stackoverflow有一些有用的问题。 High precision timing in userspace in Linux有几个有用的链接和参考。

Timing Methods in C++ Under Linux看起来很有用。

答案 2 :(得分:1)

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

#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