C 代码优化 1 . 重要的8 0 -2 0 规则 不要忘记由经验确定的 80-20 规则,它宣称一个典型的程序用 80% 的时间执行 20% 的代码。 这是一个重要的规则,因为它提醒你作为一个软件开发者的目标是识别出能全面提升你的程序性能的 20% 的代码。 你可以用各种方式无限期地优化你的函数,但除非你将精力集中在正确的函数上,否则就是白白浪费精力。 2 . 用指针运算代替数组索引 这样做常常能产生又快又短的代码。与数组索引相比,指针一般能使代码速度更快,占用空间更少。使用多维数组时差异更明显。下面的代码作用是相同的,但是效率不一样。 1. 数组索引 2. for(;;){ 3. a = array[t++]; 4. …… 5. } 1. 指针运算 2. p = array; 3. for(;;){ 4. a = *(p++); 5. …… 6. } 指针方法的优点是,array 的地址每次装入地址 p 后,在每次循环中只需对 p 增量操作。在数组索引方法中,每次循环中都必须根据 t 值求数组下标的复杂运算。 3 . 查表(游戏程序员必修课) 一个聪明的游戏大虾,基本上不会在自己的主循环里搞什么运算工作,绝对是先计算好了,再到循环里查表。看下面的例子: 旧代码: 1. long factorial(int i) 2. { 3. if (i == 0) 4. return 1; 5. else 6. return i * factorial(i - 1); 7. } 新代码: 1. static long factorial_table[] = {1, 1, 2, 6, 24, 120, 720 /* etc */ }; 2. long factorial(int i) 3. { 4. return factorial_table[i]; 5. } 如果表很大,不好写,就写一个init 函数,在循环外临时生成表格。 4. 结构体成员的布局 把长的类型放在短的前面, 可以避免内存的空洞. 5. 提升循环的性能 要提升循环的性能,减少多余的常量计算非常有用(比如,不随循环变化的计算)。 6. Inline 函数 在C++中,关键字 Inline 可以被加入到任何函数的声明中。这个关键字请求编译器用函数内部的代码替换所有对于指出的函数的调用。这样做在两个方面快于函数调用:第一,省去了调用指令需要的执行时间;第二,省去了传递变元和传递过程需要的时间。但是使用这种方法在优化程序速度的同时,程序长度变大了,因此需要更多的ROM。使用这种优化在Inline函数频繁调用并且只包含几行代码的时候是最有效的。 7. 减少函数调用参数 使用全局变量比函数传递参数更加有效率。这样做去除了函数调用参数入栈和...