购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.3 效率优先

在1.1节中,我们介绍了性能是由准确率、速度和效率构成的。笔者在书中提到过,当谈到效率时,首先指的是资源的高效利用,但同时也包括代码的运行速度(延迟)。如何看待代码在生产环境的运行情况,这里有一个实用的方法。

秘诀就是不要关注代码的速度和延迟。一般来说,对于非专业化的软件来说,速度是无关紧要的,资源的浪费和不必要的消耗才是导致速度变慢的主要原因。而且,为了追求高的速度而牺牲效率的做法总是弊大于利。因此,我们应该更多地关注效率。然而令人遗憾的是,人们往往忽视了这一点。

假设你想从城市A到城市B,途中必须穿越一条河,你可以选择一辆快车,开车驶过附近的桥到达城市B。但如果你直接跳进河里,慢慢游过河,那么你会更快到达城市B。在选择更短的路线时,虽然慢一些,但效率更高。可能有人会说,为了提高行车效率,我们可以买一辆更快的车,改善路况以减少阻力,甚至加装火箭发动机。这的确有可能比游泳过去更快,但花费的成本也高到无法估算。

软件领域也有类似的情况。比如,利用某个算法搜索存储在磁盘上的某些单词,执行速度异常缓慢。你可能很快就会想到,应该使用SSD而不是HDD。换成SSD后,搜索速度可以提升10倍,这是增加速度的最直接方式。但是,如果能找到一种方法来增强当前的算法,使其能够更快寻址到单词,就能实现更低的延迟。这表明,我们完全可以通过不增加成本的方式来获得相同甚至更好的效果。

笔者建议应该把更多的精力集中在效率上,而不是单纯地集中在执行速度上。这也是这本书的英文版为什么叫“Efficient Go”,而不是一些更吸引眼球的名称 [19] ,比如“Ultra Performance Go”或者“Fastest Go Implementations”。

虽然笔者更关注效率,但并不是说速度不重要。本书将在第3章中介绍速度与效率的联系。有时候需要对它们做出权衡,因为两者可能相互影响。我们在实践中经常会看到,程序在主流程上做的工作越少,延迟就越低。在HDD与SDD的示例中,将HDD替换为SSD时,也可以通过把之前的那些缓存逻辑删掉来提高效率(这能使用更少的内存和CPU时间)。此外,前面讲的另一种方法也能提高效率——正如1.2.3节所述,程序运行得越快,能耗就越低,从而可以提升能效。

笔者认为,应该把提高效率放在提升速度之前,这是提高性能的第一步。正如10.2节所述,只有提高效率,才能做到仅用一个CPU内核就将延迟降低为原来的七分之一。你可能会感到惊讶,有时在提高效率后,延迟也达到了预期效果!下面就来了解效率更加优先的一些原因:

很难让高效的软件变慢

可读性好的代码更容易优化,这一点与“效率高的代码通常执行得更好”的事实相似。在实践中,效率低下的软件往往性能也较差。代码的运行效率直接影响到软件的整体性能。

速度更加“脆弱”

本书将在7.3节中说明,软件的延迟取决于大量的外部因素。在独立的环境中,人们可能会有针对性地做些优化,但如果长时间运行,速度就会变慢。在某些情况下,CPU可能会由于服务器的散热问题而受到限制。其他进程(例如,定期备份)可能会让应用软件的速度慢得惊人。此外,网络问题也时常发生。当我们仅仅为了确保执行速度而编程时,往往需要考虑很多隐藏的未知因素。这就是为什么效率通常是我们程序员最能掌控的。

速度不是通用概念

如果只针对速度进行优化,那么当应用程序从开发人员的机器部署到服务器或各种客户端时,就不一定具备最初的运行速度。不同的硬件、环境和操作系统都可以改变应用程序的速度与延迟。这也是效率优先的又一个原因。首先,效率几乎不依赖外部环境。其次,效率在任何平台都是通用的。

一般来说,效率和可读性是设计软件之初就应该考虑的问题。拥有良好的效率意识,对软件的健壮性有正向作用,能避免在后期开发阶段遭遇难以弥补的愚蠢的性能错误。另外,尽可能地精简代码,对提高代码的可维护性和可扩展性也有帮助。 vCR4jkG29ae17fc0j1d3u8WiX6OyluvPhpRv/XqXbUjkAoixHhZt7u7ZqIYldoTF

点击中间区域
呼出菜单
上一章
目录
下一章
×