我想你可能知道帕累托法则,它也被称为80/20法则、关键少数法则,或者八二法则。
这个法则是基于我们生活中的认识产生的,人们在生活中发现很多变量的分布是不均匀的——在很多场景下,大约20%的因素操控着80%的局面。也就是说,所有的变量中,比较重要的只有20%,是所谓的“关键少数”。剩下的多数,却没有那么重要。
举例来讲,在企业销售中,根据帕累托法则,大约“80%的销售额来自20%的客户”。认识到这一点对企业管理至关重要,比如需要重视大客户的关系。
我总结了一下,这个法则可以有以下几个领域的指导。
1.应用程序的使用
一个应用程序往往可以提供很多功能。但是,如果我们统计用户的使用情况,会经常发现大约80%的用户使用集中在20%的程序功能。
所以,对我们开发程序的指导意义是,要花足够心思在最常用的少数功能模块上,对它的设计和实现都要充分地优化。
3.程序代码的维护
如果观察代码的维护和改进历史,你经常会发现少数代码被不断地改动,甚至经常被改得面目全非,而多数代码几乎从第一次写完后就一成不变了。按照帕累托法则,80%的代码演进和改动发生在大约20%的代码上。
对程序维护而言,我们需要对这20%的代码尽量熟悉,这样才能对其他程序员的代码改动了如指掌,一目了然。
4.程序代码的修正和纠错
统计数字也表明,所有的代码错误中,差不多有80%的错误发生在大约20%的代码上。
所以,根据帕累托法则,代码修复和纠错时要重点修复最容易产生Bug的代码,这样才能把保证整个应用程序的合理质量。
所以,我们在应用程序设计和部署时,要充分考虑帕累托法则带来的影响,尤其是客户访问的峰值时段和空闲时段。
6.程序代码的优化
所以,如果我们想提高程序的性能,最好找出这些少数代码,并做重点优化,这样就可以用很少的改动大幅度地提升整个程序和系统的性能。
那么现在,我们就从性能优化的角度,来看看如何参照帕累托法则,来规划我们性能优化工作的投入和产出。
假设我们的性能优化投入永远是按照代码的优先级来投入的,也就是说,总是要先优化最值得优化的代码。那么我们看到,只要投入差不多20%的努力,就能产出80%的性能优化产出,获得最大的投入产出比。
下图是一个根据帕累托法则来投入努力和产出效果的过程。
假如先解决20%的最重要的问题,就可以达到总体效果的80%。以后再花费80%的努力,也只能解决剩下的20%的问题。
在应用帕累托法则的时候,需要注意的是,里面的80%或者20%都是大约数字,实际的场景千差万别,不可能是恰好这两个数字。这个法则的精髓是,我们的生活和自然界万物的分布不是均匀的,总有些因素比其他因素更重要。
接下来我们来看第二个定律。这个定律你可能会感觉有点陌生。
阿姆达尔定律(Amdahl’slaw/Amdahl’sargument)是计算机科学界非常重要的一个定律和法则。它本来用于衡量处理器进行并行处理时总体性能的提升度。但其实阿姆达尔定律可以用在很多方面,为了方便你理解,我们就从一个简单的生活例子开始。
我们用洗衣服和晾衣服来举例。这里假设我们不用洗衣机,而是用传统的方式,先洗再晾。再假设洗衣服和晾衣服各需要10分钟,那么整个过程进行完需要20分钟。
在这个基础上,我们继续对晾衣服模块进行优化,速度提升5倍,从10分钟缩短到2分钟。整个过程现在需要12分钟完成。
所以在这种情况下,改进程序本身的串行算法可能比用多核处理器并行更有效。
阿姆达尔定律对我们进行性能优化的指导意义有以下2点。
下面这张图描述了不同的并行百分比场景下分别进行并行优化的曲线。不同的曲线对应不同的并行模块百分比。横轴是并行程度,也就是多少个并行处理器。纵轴是速度提升度。
对每一条曲线我们都可以看到,超过一定的并行度后,就很难进行进一步的速度提升了。
另外说明一点,阿姆达尔定律其实是另外一个定律的简化版本。这个更复杂的定律叫通用扩展定律(USL,UniversalScalabilityLaw),你有兴趣的话可以去学习一下。
这个法则看起来有点不直观,但从整个系统的宏观角度仔细想想的话就容易理解了。
所以,如果这个状态稳定,也就是说,我们的系统处理速度恰恰好赶上客户到达速度的话,一方面系统没有空闲,另外一方面客户也不需要排队在系统外等待。那么在这个稳定状态下,我们的系统的总容量就恰好等于系统里面正在处理的客户数目。也就是说,N就等于X和W的乘积。
我举一个服务器性能提升的例子来解释吧。
根据利特尔法则,我们可以有两种方案来解决这一需求。
从这里可以引申出利特尔法则在性能优化工作中的两种用处:
可以说,这些法则就是IT业和性能优化工作的“法律法规”,有了它们,我们在实际工作中才能做到“有法可依,有法必依”。熟悉并熟练应用这几个法则,对我们的工作是会有很大的帮助的。
孟子说:“不以规矩,不能成方圆。”熟悉并熟练应用这几个“规律法则”,对我们的工作是会有很大的帮助的。