我正在尝试编写基准函数,但我需要能够传入任何要测试的函数。传入的函数都是返回类型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);
答案 0 :(得分:2)
您可以使用以下内容
将benchmark
功能设为模板
#include <utility>
void A(int, char) { }
void B(int) { }
template<typename... Args>
void benchmark(int n, void(&func)(Args...), Args&&... args)
{
func(std::forward<Args>(args)...);
}
int main()
{
benchmark(1, A, 2, 'c');
benchmark(1, B, 2);
}
如果需要,可以通过为返回类型添加额外的模板参数来使其更加通用。