CSDN|如何写出让 CPU 跑得更快的代码?( 三 )
本文插图
如果内存中的数据已经在 CPU Cahe 中了 , 那 CPU 访问一个内存地址的时候 , 会经历这 4 个步骤:
- 根据内存地址中索引信息 , 计算在 CPU Cahe 中的索引 , 也就是找出对应的 CPU Line 的地址;
- 找到对应 CPU Line 后 , 判断 CPU Line 中的有效位 , 确认 CPU Line 中数据是否是有效的 , 如果是无效的 , CPU 就会直接访问内存 , 并重新加载数据 , 如果数据有效 , 则往下执行;
- 对比内存地址中组标记和 CPU Line 中的组标记 , 确认 CPU Line 中的数据是我们要访问的内存数据 , 如果不是的话 , CPU 就会直接访问内存 , 并重新加载数据 , 如果是的话 , 则往下执行;
- 根据内存地址中偏移量信息 , 从 CPU Line 的数据块中 , 读取对应的字 。
本文插图
经过测试 , 形式一 array[i][j] 执行时间比形式二 array[j][i] 快好几倍 。
之所以有这么大的差距 , 是因为二维数组 array 所占用的内存是连续的 , 比如长度 N 的指是 2 的话 , 那么内存中的数组元素的布局顺序是这样的:
本文插图
形式一用 array[i][j] 访问数组元素的顺序 , 正是和内存中数组元素存放的顺序一致 。 当 CPU 访问 array[0][0] 时 , 由于该数据不在 Cache 中 , 于是会「顺序」把跟随其后的 3 个元素从内存中加载到 CPU Cache , 这样当 CPU 访问后面的 3 个数组元素时 , 就能在 CPU Cache 中成功地找到数据 , 这意味着缓存命中率很高 , 缓存命中的数据不需要访问内存 , 这便大大提高了代码的性能 。
而如果用形式二的 array[j][i] 来访问 , 则访问的顺序就是:
本文插图
你可以看到 , 访问的方式跳跃式的 , 而不是顺序的 , 那么如果 N 的数值很大 , 那么操作 array[j][i] 时 , 是没办法把 array[j+1][i] 也读入到 CPU Cache 中的 , 既然 array[j+1][i] 没有读取到 CPU Cache , 那么就需要从内存读取该数据元素了 。 很明显 , 这种不连续性、跳跃式访问数据元素的方式 , 可能不能充分利用到了 CPU Cache 的特性 , 从而代码的性能不高 。
推荐阅读
- 聚韬品牌策划公司|如何准备一个好的商业计划书,10分钟打动投资人?
- 芯片|热钱涌入引“虚火之忧” “中国芯”如何浴火新生
- 苹果手机|iPhone 12 mini拆解图揭示苹果是如何给设备瘦身的
- 数码|强迫症患者的幸福生活 篇十三:蜗居共享经济,如何彻底榨干你家里的电子设备
- 新全球化智库|中国企业如何到海外资本市场澳交所上市融资热点连接:中国企业如何到海外资本市场澳交所上市融资
- 富前程社群裂变|富船长:如何调研客户痛点?
- 银杏|满大街可见的银杏,怎么就比大熊猫还濒危?
- 科技互联热點|低迷大屏行业如何破局?荣耀智慧屏给出的答案是:品质!
- 陆超生财|想复制都难,移动支付体验全球第一的背后,支付宝做到了哪些扫码支付的基本原理。支付宝如何保障资金安全以及服务稳定为什么欧美发达国家
- |「晓霞走市场」私域运营标杆“老钟驾到”如何IP出圈?