先上一张计算机组成原理的总结图。
思维导图连接
作为一名开发狗,经常拷问自己的灵魂三问?
这个程序有哪里可以优化的吗?这次访问的时间有点长呐这次查询的速度有点慢呀我们经常说的这些“优化”,执行时间长,查询速度慢都是和计算机性能相关的名词,如何用量化的指标进行表述出来,以及提升性能从哪些方面入手呢?希望通过我的学习和思考给你一些启发;
响应时间 直观来说是由客户端发送请求,到结果返回所消耗的时间。即程序的执行时间,降低响应时间意味着计算机运算的更快。
吞吐率 吞吐率是指一定时间范围内所能处理的事情(计算机处理的数据和指令)。缩短程序的响应时间,让程序执行的更快,一般情况下能够提升吞吐率。
我们可以通过一个简单的公式来表示性能; 性能 = 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 创作不易,喜欢的话记得收藏哦!持续更新…