C++ 嵌套循环性能

use*_*242 0 c++ performance loops

我基本上有两个向量,一个用于大量元素,第二个用于用于对元素数据进行采样的少量探针。我偶然发现了执行两个循环的顺序的问题。当然,我认为在较大的向量上使用外循环会是有益的

实施1:

for(auto& elem: elements) {
    for(auto& probe: probes) {
        probe.insertParticleData(elem);
    }
}
Run Code Online (Sandbox Code Playgroud)

然而第二次实现似乎只需要一半的时间

实施2:

for(auto& probe: probes) {
    for(auto& elem: elements) {
        probe.insertParticleData(elem);
    }
}
Run Code Online (Sandbox Code Playgroud)

原因可能是什么?

编辑:

计时由以下代码生成

clock_t t_begin_ps = std::clock();
... // timed code
clock_t t_end_ps = std::clock();
double elapsed_secs_ps = double(t_end_ps - t_begin_ps) / CLOCKS_PER_SEC;
Run Code Online (Sandbox Code Playgroud)

在插入元素数据时,我基本上做了两件事,测试到探头的距离是否低于限制并计算平均值

probe::insertParticleData (const elem& pP) {
   if (!isInside(pP.position())) {return false;}
   ... // compute alpha and beta
   avg_vel = alpha*avg_vel + beta*pP.getVel();
   return true;
}
Run Code Online (Sandbox Code Playgroud)

为了了解内存使用情况,我有大约。10k 个元素,是具有 30 个双精度数据成员的对象。在测试中,我使用了 10 个探针,其中包含 15 个双精度探针。

Bul*_*net 5

当今的 CPU 针对内存的线性访问进行了大量优化。因此,一些长循环将击败许多短循环。您希望内部循环迭代长向量。