先上一张计算机组成原理的总结图。
思维导图连接
概述
作为一名开发狗,经常拷问自己的灵魂三问?
- 这个程序有哪里可以优化的吗?
- 这次访问的时间有点长呐
- 这次查询的速度有点慢呀
我们经常说的这些“优化”,执行时间长,查询速度慢都是和计算机性能相关的名词,如何用量化的指标进行表述出来,以及提升性能从哪些方面入手呢?希望通过我的学习和思考给你一些启发;
性能指标
-
响应时间
直观来说是由客户端发送请求,到结果返回所消耗的时间。即程序的执行时间,降低响应时间意味着计算机运算的更快。 -
吞吐率
吞吐率是指一定时间范围内所能处理的事情(计算机处理的数据和指令)。缩短程序的响应时间,让程序执行的更快,一般情况下能够提升吞吐率。
影响性能的因素
我们可以通过一个简单的公式来表示性能;
性能 =
1
时
间
\frac{1}{时间}
时间1,这里我们单纯使用时间还会存在两个问题,我们看下面这个指令结果:
- 1 时间会不准,程序运行的时间=user用户态时间+sys内核态时间+程序切换的时间
- 2 不同的硬件,主频会影响指令周期。即使相同的电脑也会存在降频的因素
$ time seq 1000000 | wc -l
1000000
real 0m0.101s
user 0m0.031s
sys 0m0.016s
我们总结出:程序CPU的执行时间=指令数* CPI * 时钟周期时间,我们在考虑优化的时候应该从这个三个方向进行出发;
- 指令数:代码由编译器转换为指令,针对不同的硬件会有不同的表达方式
- 每条指令的平均时钟周期 Cycle Per instruction CPI:通过“流水线”,“冒险预测”等方式尽可能的降低CPU Cycle
- 时钟周期时间:不断的提升电脑主频,降低时钟周期时间
功耗:性能提升的拦路虎
我们上面讲到提升的性能的三个点,我们这里重点说下“时钟周期时间”(因为只有这块学习的深入些【笑哭】)。简单来说就是如何能让我们的CPU能够算的更快些,一方面我们想CPU中加入更多的晶体管,增加密度,另一方面是晶体管的打开和关闭能够更快一些,也就是提升主频。这两者都会面临的问题是耗电和散热。
直观来看,如果相同大小的CPU中堆积了更多的晶体管,晶体管散发的热量就会很大。通常我们会采取“风扇”,“水冷”等操作来降温。据说腾讯的服务器是放在山洞中,微软的是放在深海…
热量公式
功耗 ≈ \thickapprox ≈ 1 2 \frac{1}{2} 21 ×负载电容× 电 压 2 电压^2 电压2×开关频率×晶体管数量
我们单纯从“算的更快”这个角度已经有很大限制,转换思路我们从“搬的更多”来提升性能。增加计算机的核数,使程序并行计算已经成为当前比较流行的做法。如大数据分布式计算,AI中的矩阵计算;
综合以上的学习,对于性能的优化,我们学习了“摩尔定律”,“并行计算”之外,对于计算机组成原理的三大原则,进行添加解读:
- 1、加速大概率事件,例如“缓存”,“局部性原理”。将热点数据以及邻近数据加载到内存当中。还有人工智能中的“GPU”,针对大量的矩阵运算进行加速。再说到JVM编译过程中的“热点编译”。总结一句话:非均匀分布的时间处理,都可以采用该策略,都会有优化空间
- 2、流水线处理,由于CPU计算资源与存储资源的性能存在很大差异,流水线处理能够更有效的利用计算机资源。
- 3、预测与冒险,对我们的程序执行做出提前的预判,提高程序的性能。如在做数组循环时,直观的预测访问当前元素时会访问下一个元素。
参考文献:
极客时间:深入浅出计算机组成原理
计算机组成与设计[硬件与软件接口] 1.6与1.7
创作不易,喜欢的话记得收藏哦!持续更新…