CPU:这个世界慢死了观后感与总结
前记
昨天的游戏脚本项目因为没注意IO流的读取操作(仅仅只是Dbug()打印了两句话)导致运行卡顿,才引发了这篇博客的编写。体会“性能优化”的重要性。 CPU:这个世界慢死了
问题
一、为什么CPU需要多级缓存
- CPU缓存分类:
1级缓存,2级缓存,3级缓存。数字越小读取速度越快而且每个等级的缓存效率都是80%,就是说:“1L缓存能有效存储80%的CPU执行指令过程产生的中间变量数据,剩下的20%由2L存储。2L缓存的存储效率也是80%也就是总量的16%,以此类推给3L缓存就是总量的3.2%,剩下的0.8%就是存放在内存中。” - CPU缓存命中失败:
指CPU在当前的缓存中没有找到需要的数据,与之对应的是CPU缓存命中成功。- 缓存查找顺序:
1级缓存、2级缓存、3级缓存、内存。 当所有缓存区都没有找到,“应该”是抛异常或者debug的提示信息(这个我不知道)。 - 总结:
提高程序代码运行速度缓存的读取速度是远远高于内存的。
- 缓存查找顺序:
二、CPU的上下文切换为何耗时
- CPU上下文:
- CPU寄存器:
存放CPU指定执行过程中产生的中间变量数据。 - 程序计数器:
记录当前执行的指令以及下一个将要执行的指令,是一个指令序列。 - 进程:
指令执行的基本单位,拥有自己的地址空间可以存储少量数据。 - 线程:
指令执行的最小单位属于进程的一部分,只拥有一份必不可少的资源其他资源数据是在进程*享的。
- CPU寄存器:
- CPU上下文的切换:
指当前正在执行的进程或线程状态由运行状态变为阻塞状态,另外一个进程或线程由阻塞状态变为运行状态。 CPU的上下文切换也是很消耗时间的,这个过程需要准备非常多的工作,期间CPU寄存器存储进程或线程中的数据( CPU缓存(1L,2L,3L)中保存的CPU执行指令过程中产生的中间变量数据。),变为阻塞状态的的进程或是线程放入“程序计数器(指令序列)”中等待下次CPU的调度,“程序计数器”告诉CPU下一条将要执行的指令位置。
三、多线程的并发、加锁、解锁
- 知识拓展:
一个CPU(core:核)只支持运行一个进程,我们感觉快有时候并不是因为多线程的原因而是CPU太快了。 - 多线程:
多线程的并发肯定逃不了线程的切换。上面“CPU的上下文切换”已经说明了他的耗时就不复诉了。 - 线程的死锁:
由于线程是共享进程的资源很有可能发生线程的死锁。就是我需要你的资源,你需要我的数据。谁都不肯先交出自己的资源数据形成死循环一直等待所需资源的释放。 - 线程的终止:
线程的终止对程序也是会产生影响的。
四、IO操作的耗时
-
定义:
所谓的IO操作是站在内存的角度来看的,他指的是对外存的IO也就是读取或写入硬盘中的数据。 -
耗时的原因:
我们应该有个常识存储器容量越大速度越慢而我们的IO操作是针对磁盘或硬盘中的数据IO。具体有多慢请看 CPU:这个世界慢死了。 所以我们编写程序的时候要尽量减少IO操作!!! -
原文片段:
SSD固态硬盘IO读取1MB的数据需要1ms换成人类时间就是一个月。机械硬盘就更慢了。 -
Redis等高速缓存系统崛起的原因:
减少IO操作的使用。
五、参考文章
- https://blog.****.net/moutain0101/article/details/79643970
- https://blog.****.net/zhh1072773034/article/details/74240897
- https://www.cnblogs.com/wangchaowei/p/8472565.html
- https://www.b2b101.com/databank/63244654.html
- https://blog.51cto.com/13188467/2065321