百万级二维数组遍历:行优先还是列优先更高效?

百万级二维数组遍历:行优先还是列优先更高效?

高效遍历百万级二维数组:行优先与列优先的性能差异

本文分析了遍历一个100万元素的二维数组 matrix[x][y] 的两种方法,并解释了其性能差异的根本原因。

两种遍历方式如下:

方式一(行优先):

for (int x = 0; x < size; x++) {   for (int y = 0; y < size; y++) {     // ...操作 matrix[x][y] ...   } }

方式二(列优先):

for (int y = 0; y < size; y++) {   for (int x = 0; x < size; x++) {     // ...操作 matrix[x][y] ...   } }

虽然直觉上两种方式效率相近,但实际测试结果显示存在显著差异。这并非编译器优化导致,而是与计算机内存访问机制直接相关。

二维数组通常采用行优先(row-major)存储方式,这意味着同一行元素在内存中连续存储。方式一,外层循环遍历行,内层循环遍历列,使得每次访问 matrix[x][y] 时,内存访问都是连续的。而方式二,外层循环遍历列,内层循环遍历行,导致内存访问跳跃式进行。

CPU缓存机制使得连续内存访问速度远高于跳跃式访问。连续访问充分利用CPU缓存,减少内存访问次数,显著提高效率。相反,跳跃式访问频繁导致缓存失效,需要不断从主内存加载数据,降低速度。因此,在行优先存储的二维数组中,方式一(行优先遍历)效率远高于方式二(列优先遍历)。

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享