编写高效程序需要做到以下几点:
第一,必须选择一组适当的算法和数据结构
第二,必须编写出编译器能够有效优化以转换高效可执行代码的源代码(理解优化编译器的能力和局限性很重要)
程序员必须在实现和维护程序的简单性和运算速度之间做出权衡,几分钟就能编写一个简单的插入程序,而一个高效的排序算法程序可能需要一天或更长时间来实现和优化,
大多数编译器,例如GCC向用户提供了一些对它们所使用的优化的限制,最简单的控制就是指定优化级别,以命令行选项-Og 使用一组基本的优化,或者-O1或者更高
(-O2或-O3),编译器必须很小心地对程序进行安全的优化,消除造成不希望的运行时行为的一些可能的原因,为了理解决定一种程序转换是否安全的难度,看看如下两个过程
内存别名使用
void twiddle1(long *xp, long *yp)
{
*xp += *yp;
*xp += *yp;
}
void twiddle2(long *xp, long *yp)
{
*xp += 2 * *yp;
}
两个过程似乎有相同的行为,函数twiddle2的效率更高一些,因为它只需要3次内存引用,而twiddle1需要6次内存引用,不过考虑*xp等于*yp的情况,twiddle1的结果是*xp增加了4倍,而twiddle2的结果是*xp的值增加了3倍,编译器不知道函数会被如何调用,因为必须假设参数xp和yp必须相等,因此不可能产生twiddle2作为twiddle1的优化版本&