它几乎归结为这个图像(来源):
访问数据时,CPU不仅会加载单个值,还会将相邻数据加载到CPU的L1缓存中.在逐行迭代数组时,自动加载到缓存中的项实际上是接下来处理的项.但是,当您按列进行迭代时,每次加载整个"缓存行"数据(每个CPU的大小不同)时,只使用一个项目,然后必须加载下一行,从而有效地使缓存无意义.
在维基百科的条目和,作为一个高层次的概述,这PDF应该帮助你了解CPU的缓存是如何工作的.
编辑:评论中的chqrlie当然是正确的.这里的一个相关因素是,只有极少数列同时适合L1缓存.如果您的行要小得多(比如,二维数组的总大小只有几千字节),那么您可能看不到迭代每列的性能影响.
它几乎归结为这个图像(来源):
访问数据时,CPU不仅会加载单个值,还会将相邻数据加载到CPU的L1缓存中.在逐行迭代数组时,自动加载到缓存中的项实际上是接下来处理的项.但是,当您按列进行迭代时,每次加载整个"缓存行"数据(每个CPU的大小不同)时,只使用一个项目,然后必须加载下一行,从而有效地使缓存无意义.
在维基百科的条目和,作为一个高层次的概述,这PDF应该帮助你了解CPU的缓存是如何工作的.
编辑:评论中的chqrlie当然是正确的.这里的一个相关因素是,只有极少数列同时适合L1缓存.如果您的行要小得多(比如,二维数组的总大小只有几千字节),那么您可能看不到迭代每列的性能影响.