程序优化(2009-09-09)
首先,今天是个很特别的日子,因为很多情侣特意选择今天结婚(09年09月09日,有长长久久之意)。
废话说完。《高质量程序设计艺术》终于完成第5章了。第4章时间性能和第5章空间性能,其实可以合起来,就是程序优化的问题。首先,程序的时间性能跟空间性能,可以说是矛盾的,因为很多时候都是空间换时间,或者时间换空间。其次,程序优化,就有可能导致可移植性降低。所以,很多专家都认为,程序优化的首要准则是:不要优化(出自Michael A. Jackson)。当然,前提是该程序已经一个良好的程序(不懂怎么表达,反正就是好程序最好不要优化)。
优化的另一个指导思想是帕雷托法则(Pareto Principle)。本来是用在经济学问上的,而用在程序执行上表明,20%的代码通常占用了80%的执行时间。那么,只要找出这20%的代码,就可以对程序进行优化了。
优化的方法嘛,不外乎那几种:空间换时间、减少I/O操作、降低算法复杂度等等。
对于空间性能方面,由于涉及到硬件方面,所以主要是C/C++方面的问题。对于Java程序员来说,底层硬件都是不可见的,所以研究的意义不大。有个问题值得注意的,代码的长度,准确来说是编译后的文件(目标文件)大小,有时候跟执行效率有关。目标文件越小,占用内存空间就越小。
还有一个收获,认识了“内存对齐”。例如:在32位计算机中,一个char变量(占1个字节,即1 byte,也就是8位,8 bit)和一个long变量(占4个字节,即4 byte,也就是32位,32 bit)储存在一起。如果不进行内存对齐,要读取该long变量时,就要读取两个32位字的内容,再进行复杂的操作。但如果对齐后,读取该long变量就只要读取一个32位字的内容,没有复杂的操作,但这样就意味char变量后面紧跟着3个字节来实现对齐,就是有3个字节的内存空间浪费了。这是明显的空间换时间。同时这就知道了为什么内存容量总是32的倍数(因为32位的计算机每次处理32位数据或指令)。我估计下一代的计算机是64位(32的两倍),而不是40位、48位之类,是为了向下兼容。
PS. 可能近来睡眠不足,导致看书时精力不足(总是打瞌睡)。
评论已关闭