隐藏在C中经过的时间

时间:2015-05-31 14:42:57

标签: c

我需要隐藏指令以获取C中的已用时间。例如,在下一个代码中,有几行指令可以获取函数foo的已用时间。

struct timeval start_keygen, end_keygen;
long int diff_keygen_sec = 0;
gettimeofday(&start_keygen, NULL);
foo(r, w, h);
gettimeofday(&end_keygen, NULL);
timediff(start_keygen, end_keygen, &diff_keygen_sec); 

我的问题是如何在一个函数中隐藏多行,例如“getTime”,即:

getTime(foo(r,w,h))

2 个答案:

答案 0 :(得分:5)

您可以使用宏:

#define TIME(e, res) do{struct timeval start_keygen, end_keygen; \
            res = 0; \
            gettimeofday(&start_keygen, NULL); \
            e; \
            gettimeofday(&end_keygen, NULL); \
            timediff(start_keygen, end_keygen, &res)} while(0)  \

然后你可以这样做:

long int myRes;
TIME(foo(r,w,h), myRes);

这将扩展到您拥有的代码,每次在编译时使用它并将结果绑定到myRes

答案 1 :(得分:2)

一个宏真的是你想要的,但不是传递函数调用,你可以使它有点不同,它在语法上类似于一个函数,它不那么难看

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

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

#define TimedExecution(elapsed, function, ...)               \
    do {                                                     \
        struct timeval start;                                \
        struct timeval end;                                  \
        gettimeofday(&start, NULL);                          \
        function(__VA_ARGS__);                               \
        gettimeofday(&end, NULL);                            \
        *((long int *) elapsed) = timevaldiff(&start, &end); \
    } while (0)

long int
timevaldiff(struct timeval *starttime, struct timeval *finishtime)
 {
    long int msec;

    msec  = (finishtime->tv_sec  - starttime->tv_sec ) * 1000;
    msec += (finishtime->tv_usec - starttime->tv_usec) / 1000;

    return msec;
 }

void 
execute(const char *message)
 {
    for (int i = 0 ; i < 3 ; ++i)
     {
        fprintf(stdout, "%s\n", message);
        sleep(1);
     }
 }

int
main(void)
 {
    long int elapsed;
    TimedExecution(&elapsed, execute, "Hello World!");
    fprintf(stdout, "Executed in: %ld msec\n", elapsed);
    return 0;
 }