优化高效代码

利用的就是CPU缓存要比内存访问速度更快的优点,提高代码运行速度就要提高cpu缓存命中率. 缓存命中率越高,代码性能越好。CPU缓存分为数据缓存和指令缓存,就要分别提高它们的缓存命中率。

对于数据缓存,就是我们在遍历数据的时候,应该按照内存布局的顺序操作,这是因为CPU Cache是根据CPU Cache Line批量操作数据的,所以顺序地操作连续内存数据时,性能能得到有效提升。(CPU Cache Line就相当于excel一行)

对于指令缓存,就是CPU的分支预测器在起作用,分支语句的指令加载到缓存中,从而有效的提高执行速度。

  • 遍历数组的情况,按照内存布局顺序访问,将更有效的利用CPU Cache带来的好处,这样我们的代码性能就会得到很大的提升。
    注:按照内存布局顺序访问,就是数组访问元素的顺序,和内存中存放数组的元素排列顺序一致,当访问的元素在cache中存储就能直接访问到,否则就要去访问更慢的内存中寻找.

  • CPU分支预测器,如果分支预测到接下来要执行if里的指令,还是else的指令,就可以提前把这些指令放到指令缓存中,这样CPU可以直接从CPU cache中读取指令,于是执行速度就会很快.
    如何提升指令缓存命中率?
    当数组中元素都是随机的,分支预测就无法有效工作,而当数组中元素是有顺序的时候,分支预测就会动态根据历史中数据对未来进行预测,这样命中率就会提高。例如:一个数组先排序再遍历的情况和数组先遍历再排序,哪个执行速度更快点? 答案是先排序再遍历.

  • 如何提升多核CPU的缓存命中率?
    利用的原理解释:L1和L2 Cache是每个核心单独具有的,L3Cache是核心之间共享的,每一个进行在不同核心间来回切换,各个核心的缓存命中率就会受到影响,相反如果进行都在同一个核心上运行,那么其数据的L1和L2 Cache的缓存命中率就会有效提升,缓存命中率提升就意味着CPU可以减少访问内存的频率。
    调用多核就是使用多进程的形式
    当有多个同时执行 计算密集型 的进程,为了防止因为切换到不同的核心上,而导致缓存命中率的问题,我们可以把 线程绑定到某一个CPU核心上,这样性能就会提升。

参考操作系统相关资料

你可能感兴趣的:(优化高效代码)