gpt4 book ai didi

c++ - 为基准测试创建随机 vector 的最快方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:00:18 34 4
gpt4 key购买 nike

所以,我只是在尝试用 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,或者这只是我的 OCD 大脑喜欢整数? (即,当您认为模运算执行到 - 目前 - 10 的每个循环 10,000 次时,该模运算实际上是否会花费大量时间。)或者,我是否真的应该在每次运行时创建一个新 vector 种类?我一直这样做是因为我觉得创建的 vector 可能有偏差,因此如果生成该 vector 然后使用 10 次,答案可能会完全偏离...

最佳答案

Is there a better way to do this?

是的,您可能想在这里做一些事情来帮助加快速度。如前所述,在 std::vector 中保留空间然后将值分配给已知元素会更快。此外,使用非优化编译器时,预递增(++var 而不是 var++)更快。只是为了让您的代码保持快速,无论是谁构建它,您都可能希望从现在开始考虑这样做。就内存而言,您可能会发现它微不足道,但是当我使用已知的无符号大小时,并且不是不合理的大时,我会为我的 for 循环使用无符号的 short。

然而,关于模数。如果不需要,您可能不想使用它。根据 vector 中保存的数据类型,如果结果超出该类型的最大存储容量,您的结果应该换行。

我不知道它是否会消耗更多的变量包装处理能力,如果它会消耗更多的处理能力,我仍然不确定它是否比执行模运算更便宜。在使用 rand 之前,可能需要运行一些已知大小的速度测试。

    A.reserve(i * i);
for(unsigned short j = 0; j < 10; ++j) {
for(unsigned short k = 0; k < i; ++k)
A[k + (i*10)] = rand();
// Other stuff
}

编辑

需要注意的非常小的变化:循环仅进行 10 次,因此您最好使用 unsigned char,而不是 short。至少在 Win32 上,它占用一半的内存。

    A.reserve(i * i);
for(unsigned char j = 0; j < 10; ++j) {
for(unsigned char k = 0; k < i; ++k)
A[k + (i*10)] = rand();
// Other stuff
}

关于c++ - 为基准测试创建随机 vector 的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3325744/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com