一个违反直觉的结果:我的 SoA 比 AoS 更慢
学习性能优化的人,几乎都会接触到一个经典结论:
AoS 不利于 Cache。
SoA 更适合 SIMD。
SoA 通常比 AoS 更快。
因此,当我最近准备写一个 SIMD Benchmark 时,我理所当然地认为结果应该是:
AoS < SoA < AVX2换句话说:
AoS 最慢。
SoA 更快。
AVX2 最快。
然而实验结果却让我愣住了。
测试结果如下:
AoS Update : 3.18 ms SoA Update : 4.28 ms AVX2 Update : 1.48 ms最令人意外的不是 AVX2。
而是:
SoA 居然比 AoS 更慢。
测试内容
测试的数据结构非常简单。
AoS:
structParticleAoS{floatx;floaty;floatz;floatvx;floatvy;floatvz;};更新逻辑:
particles[i].x+=particles[i].vx*dt;particles[i].y+=particles[i].vy*dt;particles