性能优化1 CPU 缓存
并非原创文章,仅作为 极客时间 课程学习笔记
CPU 缓存是由高性能的 SRAM 组成,并且距离 CPU 更近,所以从缓存中的数据要比内存块很多。CPU 缓存的运行规则对分布式集群里各种操作系统、编程语言都有效。所以,一旦你能掌握它,集群中巨大的主机数量便能够放大优化效果。
多级缓存
综合硬件布局,性能等因素,CPU 缓存分为大小不等的三级缓存。当前 CPU 都是多核心的,每个核心都有自己的一,二级缓存,但三级缓存却是一颗 CPU 上所有核心共享的。
提升数据缓存命中率
for(i = 0; i < N; i+=1) {
for(j = 0; j < N; j+=1) {
array[i][j] = 0; // array[j][i] = 0;
}
}
array[i][j]
会比 array[j][i]
快 8 倍。因为数据会有预加载机制,比如将 array[0][0]
加载入内存的时候,会一并把 array[0][1]
等数组元素加载入缓存。
那当载入数组的元素时,会一次性载入多少元素呢?
这与 CPU Cache Line
有关,它定义了从内存中一次载入缓存数据的大小
其他应用
在 Nginx
中,使用哈希表存储域名 HTTP 域名等数据的,其中桶大小应该是 CPU Cache Line
的整数倍。
提高指令缓存命中率
有一小段代码是要讲数组里面的大于 128 的数字值置为 0,并将其排序。一种是先排序,后遍历。另一种是先遍历,后排序。哪种快呢?其实是先排序快,因为先排序可以提高指令缓存命中率。
如何提高的呢
CPU
含有分支预测器,如果可以预测 if else
究竟是那段代码被执行,就可以提前将要运行的代码加载入缓存。
提高多核CPU
下的缓存命中率
在多核 CPU
下,一二级缓存是面向单颗 CPU
的,第三级缓存是面向所有 CPU
的。如果 「甲进程」在某个时刻在 CPU1
上运行,并填充了三级缓存。之后「甲进程」又被调度到了 CPU2
上,这样缓存就失效了。解决方式是可以通过操作系统提供的系统调用,将一个进程和某一颗特定的 CPU
进行绑定。
思考题
多线程并行访问不同的变量,这些变量在内存布局是相邻的(比如类中的多个变量),此时 CPU 缓存就会失效,为什么?又该如何解决呢?
参考:
你在学缓存(盯
学会了吗(盯
这属于哪个领域?后端?
对的,设计「计算机组成原理」和「操作系统」的只是
有精品网课推荐吗?
操作系统推荐 b 站 「清华大学操作系统」,书籍推荐「深入理解操作系统」(这本书可以看做 组成原理和操作系统的综合)
看完这个书和网课,就能找到一份后端工作了吗?
找到一份后端工作需要
1. 包括但是不限于「操作系统」「计算机网络」「数据库」「计算机组成原理」等基础知识
2. 跟着 y 总好好练算法
3. 一段知名互联网公司的实习 or 一个自己满意的项目
谢谢~
0基础学这些,到能找工作的程度,都需要多久?
0 基础的话,至少脱产学一年,应该能找一份编程的工作。
没那么多时间给我学些ToT
但是我看你上过 y 总的其他课了吧,那就不算是完全零基础啊
就上了个基础课,还没学明白ToT
y总,只有算法课啊。哪里有精品的操作系统、计算机网络、数据库、计算机组成原理的课程,可以学习?付费的也行~
我觉得你可以 b 站搜深入理解计算机系统,这门课作为导论课来学还是不错的。
谢谢~