为什么在循环 8192 个元素时性能会下降
当循环 8192 个元素时,程序会遇到明显的减速。这是由于内存对齐问题造成的,低效的循环结构加剧了这一问题。
内存对齐
现代处理器利用缓存层次结构来提高数据访问速度。对齐的内存访问(其中数据存储在缓存行大小的倍数的地址处)允许更快的数据检索。但是,在本例中,SIZE 参数定义为 8192,它不是缓存行大小(通常为 64 字节)的倍数。这种不对齐会减慢内存访问操作。
循环排序
循环的排序使内存对齐问题更加复杂。原始代码按列迭代矩阵,导致非顺序内存访问。这迫使处理器以较慢的速度从内存中随机检索数据。
解决方案
有两种可能的解决方案:
通过交换代码中的循环顺序,消除了性能瓶颈。
示例
以下代码说明了修复:
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中文网其他相关文章!