程序效率

为什么程序效率仍然很重要

引言

好像有人觉得,现在的硬件系统和10来年前比起来,已经有了很大的飞跃,再也不用拼命考虑程序效率的问题了。是这样的吗?

1. 首先来进行一个数学计算

程序的实际运行时间 = CPU执行时间 + 等候CPU资源时间(简称等候时间)等。

假设一个程序需要的CPU执行时间是t,CPU的每个运行周期的时长是l。为了简化起见,这里假设t=l,也就是说,程序可以恰好在一个CPU运行周期内运行完成。

假设同时有n个请求运行该程序。那么平均起来,每个程序的等候时间是:
(0+l+2*l+...(n-1)*l)/n = ((n-1)/2)*l = ((n-1)/2)*t

假设n=1000,也就是说我们有1000个请求同时请求该程序。那么,当程序需要的CPU执行时间t增加1倍时,对于每个请求实际的等候时间将增加500倍左右,每个请求所需要的实际运行时间将增加501倍!*

2. 为什么程序效率仍然很重要

一个程序,如果在设计上有所疏忽,比如说使用的循环多跑了1倍时间的话,虽然表面上看起来只是CPU执行的时候多执行了一倍的时间,但是在系统(例如web服务器)负荷较大的情况下,会导致程序的等候时间大大增加,而且程序所需要的等候时间的增加远远超过程序在CPU中的执行时间的增加!

因此,即使是在现在硬件不断提升的情况下,程序效率的考虑依然十分重要,尤其是对于需要支持(大量)并发请求的应用程序来讲。

好的程序员应该不满足于仅仅实现某个功能,而应该同时注重如何提高程序的运行效率。一个效率不高的程序很可能成为系统开发中的一个恶梦。

3. 一个例子

vBulletin是非常著名的一套商业版的BBS系统。该系统功能强大,4年前Deminy曾在其基础上做过一定的开发工作。该系统传承了传统的软件开发模式,但是忽略了网络系统开发所面对的新问题,过多地注重了系统的功能性而几乎完全忽略了系统的运行效率问题,不能够好好的处理大量并发请求。该BBS系统访问量略一上升,将导致每个访问请求的等候时间大大延长,系统的性能大幅度下降。vBulletin这个BBS系统对于大访问量的网站来讲,是个恶梦般的系统。这是一个非常经典的例子,用来说明为什么开发中程序效率的考虑是非常重要的。

上面这个例子是4年前的例子,希望现在的vBulletin已经修正了这个问题。

4. 一点感想

如果有人写《程序员编程效率指南》这类的书籍,一定会很经典。希望早日看到这类书籍。

[补充说明*] 该数学模型不是非常精确,但是可以很清楚地说明问题。

标签:

类别: