好奇的探索者,理性的思考者,踏实的行动者。
Table of Contents:
抽象
封装,隐藏实现细节
自顶向下逐步分解
以空间换时间
空间和时间局部性原理
面向摩尔定律的设计
由于摩尔定律,单芯片的集成度相对于设计开始时很容易翻一番甚至翻两番。计算机设计者必须预测其设计完成时的工艺水平,而不是设计开始时的。
比如google提供的免费gmail服务就是预测将来硬盘价格会大幅下降
使用抽象简化设计
使用抽象技术来表示不同的设计层次,在高层次中看不到低层次的细节,只能看到一个简化的模型。
例如计算机网络层次划分模型,软件开发SDK,API等无不体现出抽象的思想。
加速大概率事件
加速大概率事件(Common case fast)远比优化小概率时间更能提高性能。大概率事件通常比小概率事件简单,从而易于提高。大概率事件规则意味着设计者需要知道什么事件是经常发生的,这只有通过仔细的实验与评估才能得出。
例如:各种缓存(内存缓存、CDN缓存),索引等。
Amdahl定律(Amdahl’s law)
阐述提升一个系统的一个部分的性能对整个系统有多大影响。它是“收益递减定律”的量化版本。
通过并行提高性能
从计算机诞生开始,计算机设计者就通过并行执行操作来提高性能。
例如:多线程,并发编程调用等提升吞吐量。
通过流水线提高性能
现代的工厂里的生产线叫“流水线”。我们可以把装配 iPhone 这样的任务拆分成一个个细分的任务,让每个人都只需要处理一道工序,减少中间等待的环节,最大化整个工厂的生产效率。类似的,我们的 CPU 其实就是一个“运算工厂”。我们把 CPU 指令执行的过程进行拆分,细化运行,也是现代 CPU 在主频没有办法提升那么多的情况下,性能仍然可以得到提升的重要原因之一。
例如:一个大规模的SQL分成几个规模适当的小SQL进行执行、分布式系统、异步编程,分而治之,MapReduce,Fork/Join等。
通过预测提高性能
在某些情况下,如果假定从误预测恢复执行代价不高并且预测的准确率相对较高,则通过猜测的方式提前开始某些操作,要比等到确切知道这些操作应该启动时才开始要快一些。
例如:小说的下一页预加载,电商大促的CDN预热,空间换时间等。
存储器层次
程序员希望存储器速度更快,容量更大,价格更便宜。设计师们发现可以通过存储器层次(hierarchy of memory)来解决这些相互矛盾的需求。在存储器层次中,速度最快,容量最小并且每位价格最昂贵的存储器位于顶层,而速度最慢,容量最大且每位价格最便宜的存储器位于最底层。程序员看到的主存同时具有存储器层次中顶层的高速度和底层的大容量和便宜的特征。可以把存储器层次想象成一个堆叠的三角形,该形状表示速度/价格/和容量:越靠近顶端,存储器速度越快/每位价格越高:底层宽度越大,存储器容量越大。
通过冗余提高可靠性
计算机不仅需要速度快,还要工作可靠。由于任何一个物理器件都有可能失效,因此可以通过使用冗余部件的方式提高系统的可靠性(dependable),冗余部件可以替换失效部件。可以通过牵引式挂车来理解可靠性:牵引式挂车后轴两边具有双轮胎,在一个轮胎出问题时卡车仍然可以继续工作。(在一个轮胎出问题时,卡车司机立即直接开往修理厂进行修理,从而恢复冗余性。)
例如:冗余也可以提升性能,如数据库查询。