使用 for 循环是否比在 C++ 中将内容保存在向量中更快?

Is using for loops faster than saving things in a vector in C++?

本文关键字:保存 存在 向量 循环 for 是否 C++ 使用      更新时间:2023-10-16

很抱歉标题不好,但我实际上想不出更好的标题(欢迎建议(。

我得到了一个大网格(1000 * 1000 * 1000(。

for (int k = 0; k<dims.nz; k++);
{
for (int i = 0; i < dims.nx; i++)
{
for (int j = 0; j < dims.ny; j++)
{
if (inputLabel->evalReg(i, j, 0) == 0)
{
sum = sum + anotherField->evalReg(i, j, 0);
}
}
}
}

我遍历所有网格点,以查找哪些网格点在我的标签字段中具有值 0,并汇总另一个字段的相应值。

在此之后,我想将上面检测到的所有点设置为某个值。

再次基本上做相同的 for 循环会更快(而这次设置值而不是读取它们(,还是我应该将我得到的所有位置写入一个单独的向量(它必须在我们检测到某些东西的循环的每一步中改变大小(并简单地构建一个 for 循环,例如

for(int p=0; p<size_vec_1,p++)
{
anotherField->set(vec_1[p],vec_2[p],vec_3[p], random value);
}

关键是我不知道由于不同的数据,我的 routien 会对网格产生多大影响。可能是数据的一半或完全不同的数据。我可以对方法的速度进行通用估计,还是完全取决于我的值的分布?

关键是我不知道由于不同的数据,我的 routien 会对网格产生多大影响。

这里有一个可能有效的技巧:随机对inputLabel进行采样,以近似地计算出有多少条目为 0。如果有几个,那么走"将索引放入向量"的方式。如果很多,那么走"再次扫描阵列"的方式。

它需要针对特定的计算机进行微调,两种情况之间的阈值应该是多少,要采集多少样本(它不应该太大,因为近似值会花费太多时间,但不应该太小而无法获得良好的近似值(等。

奖励技巧:获取缓存行对齐和缓存行大小的样本。这样,近似将花费类似的时间(因为它是内存限制的(,但近似会更好。

相关文章: