网络攻击日益凶猛
形式一用 array[i][j] 访问数组元素的顺序,正是和内存中数组元素存放的顺序一致。当 CPU 访问 array[0][0] 时,由于该数据不在 Cache 中,于是会「顺序」把跟随其后的 3 个元素从内存中加载到 CPU Cache,这样当 CPU 访问后面的 3 个数组元素时,就能在 CPU Cache 中成功地找到数据,这意味着缓存命中率很高,缓存命中的数据不需要访问内存,这便大大提高了代码的性能。
而如果用形式二的 array[j][i] 来访问,则访问的顺序就是: 使用相同的用例结合库和语言 在我第一次面试之前,我需要先完成一个招聘任务。那是一个简单的web应用程序,所以我编写了一些代码,在google上搜索了对于一些更棘手部分的解决办法,然后就完成了应用程序的编写。 在面试中,招聘者问我为什么在代码中混用jQuery代码和纯JavaScript代码,我无从作答。事实是,我粘贴了一些的代码片段,没有多加思考,看到代码正常运作后,我就继续下一步任务了。 这种错误在初级开发人员中很常见。我们太专注于解决任务,以至于没有花时间去考虑我们正在做的内容。不要掉进这个新手陷阱,记得检查每一行代码来确保你知道为什么要把它放在那里。 重复代码 不要写重复的代码(DRY)是编程的法则。为重复码创建抽象机制是编程的本质。但刚开始的时候,这往往很有挑战性。你想解决问题,所以尽你所能去做。然后继续执行其他任务,就会一直编写重复代码。相信我,你可以做得更好。 尽早养成好习惯。每当你完成一个功能时,重新阅读代码,思考是否有机会重构某些东西。记住,代码的第一个版本是有缺陷的,你需要去改进它。
另外,当你在处理其他功能时,请花时间分析重复代码。你几乎发现总能有重写它的余地(例如,使用一个循环或创建一个新函数)。如果每次都这样自我改进,你会编写出更稳健、更优雅的代码。 如果内存中的数据已经在 CPU Cahe 中了,那 CPU 访问一个内存地址的时候,会经历这 4 个步骤:
到这里,相信你对直接映射 Cache 有了一定认识,但其实除了直接映射 Cache 之外,还有其他通过内存地址找到 CPU Cache 中的数据的策略,比如全相连 Cache (Fully Associative Cache)、组相连 Cache (Set Associative Cache)等,这几种策策略的数据结构都比较相似,我们理解流直接映射 Cache 的工作方式,其他的策略如果你有兴趣去看,相信很快就能理解的了。 如何写出让 CPU 跑得更快的代码? 我们知道 CPU 访问内存的速度,比访问 CPU Cache 的速度慢了 100 多倍,所以如果 CPU 所要操作的数据在 CPU Cache 中的话,这样将会带来很大的性能提升。访问的数据在 CPU Cache 中的话,意味着缓存命中,缓存命中率越高的话,代码的性能就会越好,CPU 也就跑的越快。 于是,「如何写出让 CPU 跑得更快的代码?」这个问题,可以改成「如何写出 CPU 缓存命中率高的代码?」。 在前面我也提到, L1 Cache 通常分为「数据缓存」和「指令缓存」,这是因为 CPU 会别处理数据和指令,比如 1+1=2 这个运算,+ 就是指令,会被放在「指令缓存」中,而输入数字 1 则会被放在「数据缓存」里。 因此,我们要分开来看「数据缓存」和「指令缓存」的缓存命中率。 1. 如何提升数据缓存的命中率?
假设要遍历二维数组,有以下两种形式,虽然代码执行结果是一样,但你觉得哪种形式效率最高呢?为什么高呢? (编辑:惠州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |