循环 8192 个元素时的性能影响
当矩阵大小(特别是行数)为2048 的倍数(例如 8192)。这种现象被称为超级对齐,是由于现代 CPU 中的特定内存管理实践而产生的。
提供的代码片段演示了这个问题,其中矩阵 res[][] 是根据矩阵 img[ 计算得出的][]。不同矩阵大小(特别是 8191、8192 和 8193)的性能显示,当矩阵大小为 8192 时,性能显着下降。
超级对齐效果
性能差异源于对矩阵的逐列迭代的嵌套循环导致的对内存的不均匀访问图像[][]。这种非顺序访问模式会导致现代 CPU 的性能下降,而现代 CPU 通过顺序内存访问可以更有效地运行。
解决方案:互换外循环
解决方案在于重新排序嵌套循环,优先考虑行迭代而不是列迭代。通过这样做,内存访问变得顺序,显着提高性能:
性能结果
以下性能结果展示了通过交换外循环实现的改进:
Matrix Size | Original Code (s) | Interchanged Loops (s) |
---|---|---|
8191 | 1.499 | 0.376 |
8192 | 2.122 | 0.357 |
8193 | 1.582 | 0.351 |
此优化极大地减少了维度为以下倍数的矩阵的性能差距2048,从而在不同的矩阵大小上获得一致的性能。
以上是为什么循环 8192 个元素比 8191 或 8193 慢得多?的详细内容。更多信息请关注PHP中文网其他相关文章!