这是一种创建一个聪明的宏来自动测试C中的东西的方法吗?

qfe3c7zg  于 2023-05-16  发布在  其他
关注(0)|答案(2)|浏览(139)

我想知道是否有可能创建一个聪明的宏来自动在C中使用C的“进程”。假设我有一个这样的小结构:

typedef struct pbench {
  char description[256];
  int nbenchs;
  double times;
} ProcessBench;

还有一个宏(get_time()是一个返回double的函数):

#define BENCH(process, bench_struct, description)      \
  int i;                                               \
  bench_struct.description = description;              \
  bench_struct.nbenchs = 50;                           \
  double start = get_time();                           \
  for (i = 0; i < bench_struct.nbenchs; ++i)           \
    process();                                         \
  bench_struct.times = get_time() - start;

如果我没有弄错的话,这个宏可以用来对任何带有签名void func()的函数使用BENCH(func, func_bench, func_description)进行基准测试。
有没有一种方法可以创建一些像这样的宏来对void func_args(args...)return_type func_return()return_type func_return(args...)甚至小行代码进行基准测试?

ttvkxqim

ttvkxqim1#

你可以只传递整个函数调用,包括参数,而忽略任何函数结果,例如:

#define BENCH(process, bench_struct, description)      \
  int i;                                               \
  bench_struct.description = description;              \
  bench_struct.nbenchs = 50;                           \
  double start = get_time();                           \
  for (i = 0; i < bench_struct.nbenchs; ++i)           \
    process;                                           \
  bench_struct.times = get_time() - start;

BENCH(func(x, y, z), func_bench, func_description)

(Note宏的小变化-括号已从process中删除。)

jvlzgdj9

jvlzgdj92#

这是我解决办法。

#define benchmark(x) for (float startTime = (float)clock() / CLOCKS_PER_SEC, run = 1.0; run == 1.0; run = 0, printf("\n%s\nTime elapsed: %fs\n", x, (float)clock() / CLOCKS_PER_SEC - startTime))

确保它在一行中或使用“\”。这样使用它:

benchmark("Some description")    
{    
    ///your code that you wanna measure its execution time     
}

相关问题