这是创建一个聪明的宏来自动对 C 中的某些东西进行基准测试的方法吗?
Is it a way to create a clever macro to automatically benchmark something in C?
我想知道是否可以创建一个聪明的宏来自动在 C 中执行 "process" 并且只使用 C。假设我有一个像这样的小结构:
typedef struct pbench {
char description[256];
int nbenchs;
double times;
} ProcessBench;
还有一个宏(get_time()
是一个返回双精度的函数):
#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, func_bench, func_description)
对签名 void func()
的任何函数进行基准测试。
有没有一种方法可以创建一些像这样的宏来对 void func_args(args...)
、return_type func_return()
、return_type func_return(args...)
甚至小行代码等函数进行基准测试?
您可以只传递整个函数调用,包括参数,而忽略任何函数结果,例如
#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)
(请注意宏的细微变化 - 括号已从 process
中删除。)
我想知道是否可以创建一个聪明的宏来自动在 C 中执行 "process" 并且只使用 C。假设我有一个像这样的小结构:
typedef struct pbench {
char description[256];
int nbenchs;
double times;
} ProcessBench;
还有一个宏(get_time()
是一个返回双精度的函数):
#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, func_bench, func_description)
对签名 void func()
的任何函数进行基准测试。
有没有一种方法可以创建一些像这样的宏来对 void func_args(args...)
、return_type func_return()
、return_type func_return(args...)
甚至小行代码等函数进行基准测试?
您可以只传递整个函数调用,包括参数,而忽略任何函数结果,例如
#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)
(请注意宏的细微变化 - 括号已从 process
中删除。)