我需要隐藏指令以获取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))
答案 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;
}