首页 >后端开发 >C++ >为什么我的循环在处理 8192 个元素时很慢?

为什么我的循环在处理 8192 个元素时很慢?

DDD
DDD原创
2024-12-10 09:51:10685浏览

Why is My Loop Slow When Processing 8192 Elements?

为什么在循环 8192 个元素时性能会下降

当循环 8192 个元素时,程序会遇到明显的减速。这是由于内存对齐问题造成的,低效的循环结构加剧了这一问题。

内存对齐

现代处理器利用缓存层次结构来提高数据访问速度。对齐的内存访问(其中数据存储在缓存行大小的倍数的地址处)允许更快的数据检索。但是,在本例中,SIZE 参数定义为 8192,它不是缓存行大小(通常为 64 字节)的倍数。这种不对齐会减慢内存访问操作。

循环排序

循环的排序使内存对齐问题更加复杂。原始代码按列迭代矩阵,导致非顺序内存访问。这迫使处理器以较慢的速度从内存中随机检索数据。

解决方案

有两种可能的解决方案:

  1. 对齐内存:将 SIZE 重新定义为缓存行大小的倍数(例如 8192 64).
  2. 交换循环排序:不是按列迭代,而是按行迭代矩阵。这使内存访问与缓存行组织保持一致,从而实现更快、更高效的数据检索。

通过交换代码中的循环顺序,消除了性能瓶颈。

示例

以下代码说明了修复:

for(j=1;j<SIZE-1;j++) {
    for(i=1;i<SIZE-1;i++) {
        res[j][i]=0;
        res[j][i] += img[j-1][i-1];
        ...
    }
}

性能对比

应用修复后,性能显着提升:

原始代码:

SIZE = 8191: 1.499 seconds
SIZE = 8192: 2.122 seconds
SIZE = 8193: 1.582 seconds

固定代码:

SIZE = 8191: 0.376 seconds
SIZE = 8192: 0.357 seconds
SIZE = 8193: 0.351 seconds

以上是为什么我的循环在处理 8192 个元素时很慢?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn