如何使用struct timeval来获取执行时间?

时间:2012-10-04 08:08:21

标签: c

在阅读this article关于经过的时间后,我写了一个简单的代码来计算循环的执行时间:

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

int main (int argc, char** argv) {
    struct timeval, tvalBefore, tvalAfter;

    gettimeofday (&tvalBefore, NULL);
    int i =0;
    while ( i < 1000) {
        i ++;
    }

    gettimeofday (&tvalAfter, NULL);

    printf("Time in microseconds: %0.3f microseconds\n",
            (float)(tvalAfter.tv_sec - tvalBefore.tv_sec) 
          )
    return 0;
}

clang编译器给出了以下错误:

print_time.c:7:16: error: expected identifier or '('
        struct timeval, *tvalBefore, *tvalAfter;
                      ^
print_time.c:13:17: error: use of undeclared identifier 'tvalBefore'
        gettimeofday (&tvalBefore, NULL);
                       ^
print_time.c:19:17: error: use of undeclared identifier 'tvalAfter'
        gettimeofday (&tvalAfter, NULL);
                       ^
print_time.c:22:12: error: use of undeclared identifier 'tvalAfter'
                        (float)(tvalAfter.tv_sec - tvalBefore.tv_sec) 
                                ^
print_time.c:22:31: error: use of undeclared identifier 'tvalBefore'
                        (float)(tvalAfter.tv_sec - tvalBefore.tv_sec) 
                                                   ^
5 errors generated.

我无法弄清楚我的代码有什么问题,不知道吗?

2 个答案:

答案 0 :(得分:29)

您的代码中有两个输入错误:

 struct timeval,

应该是

 struct timeval

printf()括号之后,您需要一个分号。

此外,根据编译器的不同,可以简化一个简单的循环,无论你做什么,都会给你0微秒的时间。

最后,时间计算是错误的。您只考虑秒数,忽略微秒。您需要获得秒之间的差异,乘以一百万,然后添加“之后”tv_usec并减去“之前”tv_usec。通过向浮点数转换整数秒来获得任何结果。

我建议查看struct timeval的手册页。

这是代码:

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

int main (int argc, char** argv) {
    struct timeval tvalBefore, tvalAfter;  // removed comma

    gettimeofday (&tvalBefore, NULL);
    int i =0;
    while ( i < 10000) {
        i ++;
    }

    gettimeofday (&tvalAfter, NULL);

    // Changed format to long int (%ld), changed time calculation

    printf("Time in microseconds: %ld microseconds\n",
            ((tvalAfter.tv_sec - tvalBefore.tv_sec)*1000000L
           +tvalAfter.tv_usec) - tvalBefore.tv_usec
          ); // Added semicolon
    return 0;
}

答案 1 :(得分:11)

变化:

struct timeval, tvalBefore, tvalAfter; /* Looks like an attempt to
                                          delcare a variable with
                                          no name. */

为:

struct timeval tvalBefore, tvalAfter;

如果每行只有一个声明,则不太可能(IMO)犯这个错误:

struct timeval tvalBefore;
struct timeval tvalAfter;

在单行上声明指向类型的指针时,它会更容易出错:

struct timeval* tvalBefore, tvalAfter;

tvalBeforestruct timeval*tvalAfterstruct timeval