性能相对论浅说

性能相对论浅说

程序员间最容易引发混战的一些话题:编程语言、框架、算法、操作系统 ... 等,只要一聊到这些话题,难免就是一场混战,各抒己见,谁也别想说服谁。

论战中,最常被提到的就是性能。性能这东西,感觉很容易评估,只要有数据,数据一对比就知道高低了,有什么好论战的呢?

我认为之所以会争论不休,是因为大家的“参照系”不同,今天我想说说我的性能相对论观点,希望大家在讨论性能话题之前可以有一些基本的共识,以避免无止境的争论。

首先说下数据的性能意义,诸如:10w长连接,10w请求,10w查询...等,这些数据,其实是没有性能意义的,就像单纯的几何没有物理意义一样,只有这些数据结合了时间、空间等参数,才具有性能意义。比如:10w长连接每秒10万请求,每秒10w查询等。

其次是参照系,我们从物理上可以学到一个知识,就是数据需要放到相同参照系下才等价,或者通过参照系的关系转换之后数据才能直接对比(说法不严谨,请忽略这里的民科味)。

当我们在说:每秒10w查询的时候,并没有给出这个数据所在的参照系,比如:网络设备配置、存储设备配置、查询算法、查询复杂度等等诸多影响数据的因素。

所以,性能其实是相对的,我们选取的参照系不同,数值的意义就不同,当我们要拿数值做对比时,我们需要同时给出我们的参照系,如果两个不同参照系下获得的性能数值,我们要进行对比,那么我们需要转换后才能对比。

一旦脱离了以上准则进行性能数值的PK和讨论,从而判断某一技术的好坏,是不科学的,这就是绝大多数论战的根本原因,大家脱离参照系谈论数值。

有时候我们很难选取一致的参照系,比如生产环境和测试环境有很大差异,但我们又需要对一项技术做性能评估,这时候怎么办呢?

我们从benchmark这个词的词义入手,这个词程序员都很熟悉,百度翻译是:

benchmark [英][ˈbentʃmɑ:k] [美][ˈbentʃmɑ:rk]
n.基准,参照; 标准检查程序; 水准标;
vt.检测(用基准问题测试);

词义其实已经给我们指明了方向,我们需要为自己的技术评估确定一个基准,然后相对于这个基准我们来做性能评估。

比如我希望测试哈希表的查询效率,如果单纯的只是对哈希表做性能测试得到一个每秒多少多少万的增删改查操作次数,单凭这些数值我就说哈希表性能好或不好是没有意义的。

我们所说的好于不好,需要有一个参照。所以,需要一个基准值来评估哈希表相对于这个基准值是好了多少或差了多少,比如:我可以选取链表的增删改查效率来作为基准值,从而评估出哈希表相对于链表来说查询效率高了多少,非查询操作效率差了多少。

也许不存在一个具体的基准测试,但必然存在一个基准值,这个值也许在你心里。

比如线上已经用了A算法实现功能,接着换了B算法,得到了效率提升,这时候其实我们是在相对于A算法来评估B算法。

所以,性能是相对的,脱离参照系谈论性能是无意义的。

当我们需要拿数值跟其他人对比时,选取相同参照系才有意义,否则,我们可以通过基准测试来做自己的性能测试,这时候无需跟其他系统的实验数值做比较。

最后,我们还可以得到一个结论,性能的好坏不是靠数值的绝对大小来评价的,在A系统下的2K也许远好于B系统下的20W,追求数值的绝对大小是无意义的。

编辑于 2015-07-06 22:38