【发布时间】:2012-11-03 19:14:08
【问题描述】:
所以,我只是在尝试在 C++ 中实现一些排序算法,但我发现目前对它们进行基准测试很烦人,因为不运行算法需要很长时间,而是创建输入数据。我目前测试每个输入长度(1000、2000,...)10 次,以获得稍微平均的时间。对于这 10 次中的每一次,我都会创建一个长度正确的新随机 vector,方法是:
// Each of the 10 times.
for(int j = 0; j < 10; j++) {
A.clear();
// 'i' is the current input size.
for(int k = 0; k < i; k++) {
A.push_back(rand() % 10000);
}
// Other stuff
}
有没有更好的方法来做到这一点?我应该费心将 rand() 限制在 10000,还是只是我的强迫症大脑喜欢整数? (即,当您认为模运算实际上执行到 - 目前 - 10 的每个循环 10,000 时,该模运算实际上是否会花费大量时间。)或者,我是否真的应该在每次运行时创建一个新向量种类?我一直这样做是因为我觉得创建的向量可能会存在偏差,因此如果生成该向量然后使用 10 次,那么答案可能会大错特错......
【问题讨论】:
-
与随机数生成相比,我无法想象模数是相关的。但是,很容易测试:只需将其移除并测量。 (你会测试发布版本,不是吗?)
-
排序算法真的像随机数据。您没有创建准确的基准,请使用真实数据。
-
@Hans Passant 你能举例说明我在哪里可以找到一些不错的预制真实数据吗?因为我担心在考虑如何生成真实数据时我不知道从哪里开始......尤其是当我试图想象有多少不同的类型时(非常预先排序,非常混乱,等),这会更常见......
-
如果你想真正彻底,
std::next_permutation()是你的朋友。:)
标签: c++ benchmarking stdvector