【发布时间】:2014-12-12 02:17:03
【问题描述】:
我正在尝试编写一个基准函数,但我需要能够传入任何要测试的函数。传入的函数都是返回类型 void,但它们的参数不同。我确信这是一件简单的事情,但我不确定最好的方法。
// 95% confidence interval
void benchmark(int n)
{
int res[n];
for (int i = 0; i < n; i++) {
uint64_t start = GetTimeMs64();
// **TODO: code to benchmark...**
uint64_t end = GetTimeMs64();
res[i] = end - start;
}
double avg = 0.0;
for (int i = 0; i < n; i++) avg += res[i];
avg /= double(n);
double variance = 0.0;
for (int i = 0; i < n; i++) {
variance += ((res[i] - avg) * (res[i] - avg));
}
variance /= double(n - 1);
cout << "Sample mean: " << avg << " +/- " << (1.96 * (sqrt(variance) / sqrt(n))) << endl;
}
例如,我想做这样的事情:
void A(int a, int b) { return a + b; }
void B(int a) { return a * a; }
benchmark(100, A);
benchmark(100, B);
【问题讨论】:
-
基本思想是向编译器谎报函数的签名,用任何合适的参数调用它,并希望你永远不会出错,因为编译器将无法帮助你。
-
除非你写它是为了好玩,看看nonius,除此之外你可以使用某种类型擦除将多重签名函数及其参数存储到一个具有相同签名的函子。
-
谢谢@ScottHunter!我完全没有想到的事情:它会影响基准测试结果约 10 毫秒,因为它是额外的操作。
标签: c++ function-pointers