15

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

#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.

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

4

2 回答 2

36

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

 struct timeval,

应该

 struct timeval

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

此外,根据编译器的不同,如此简单的循环可能会被优化出来,无论你做什么,都会给你 0 微秒的时间。

最后,时间计算错误。您只考虑秒数,忽略微秒。你需要得到秒之间的差异,乘以一百万,然后加上 "after"tv_usec并减去 "before" 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;
}
于 2012-10-04T08:12:13.880 回答
13

改变:

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;

tvalBefore是一个struct timeval*但是tvalAfter是一个struct timeval

于 2012-10-04T08:11:00.770 回答