- 8
- 0
- 约4.12千字
- 约 6页
- 2017-01-06 发布于贵州
- 举报
C语言代码优化C语言代码优化
C 代码优化1. 重要的80-20规则
不要忘记由经验确定的 80-20 规则,它宣称一个典型的程序用 80% 的时间执行 20% 的代码。
这是一个重要的规则,因为它提醒你作为一个软件开发者的目标是识别出能全面提升你的程序性能的 20% 的代码。
你可以用各种方式无限期地优化你的函数,但除非你将精力集中在正确的函数上,否则就是白白浪费精力。
2. 用指针运算代替数组索引
这样做常常能产生又快又短的代码。与数组索引相比,指针一般能使代码速度更快,占用空间更少。使用多维数组时差异更明显。下面的代码作用是相同的,但是效率不一样。
数组索引??
for(;;){??
????a?=?array[t++];??
????……??
}??指针运算??
p?=?array;??
for(;;){??
????a?=?*(p++);??
????……??
}??指针方法的优点是,array的地址每次装入地址p后,在每次循环中只需对p增量操作。在数组索引方法中,每次循环中都必须根据t值求数组下标的复杂运算。
3.? 查表(游戏程序员必修课)
一个聪明的游戏大虾,基本上不会在自己的主循环里搞什么运算工作,绝对是先计算好了,再到循环里查表。看下面的例子:
旧代码:
long?factorial(int?i)???
{???
????if?(i?==?0)???
???return?1;???
else???
???return?i?*?factorial(i?-?1);???
}??
新代码:
static?long?factorial_table[]?=?{1,?1,?2,?6,?24,?120,?720??/*?etc?*/?};???
long?factorial(int?i)???
{???
return?factorial_table[i];???
}??如果表很大,不好写,就写一个init函数,在循环外临时生成表格。
4. 结构体成员的布局
把长的类型放在短的前面, 可以避免内存的空洞.
5. 提升循环的性能
要提升循环的性能,减少多余的常量计算非常有用(比如,不随循环变化的计算)。
6. Inline函数
在C++中,关键字Inline可以被加入到任何函数的声明中。这个关键字请求编译器用函数内部的代码替换所有对于指出的函数的调用。这样做在两个方面快于函数调用:第一,省去了调用指令需要的执行时间;第二,省去了传递变元和传递过程需要的时间。但是使用这种方法在优化程序速度的同时,程序长度变大了,因此需要更多的ROM。使用这种优化在Inline函数频繁调用并且只包含几行代码的时候是最有效的。
7. 减少函数调用参数
使用全局变量比函数传递参数更加有效率。这样做去除了函数调用参数入栈和函数完成后参数出栈所需要的时间。然而决定使用全局变量会影响程序的模块化和重入,故要慎重使用。
8. static-把本地函数声明为静态的
如果一个函数只在实现它的文件中被使用,把它声明为静态的(static)以强制使用内部连接。否则,默认的情况下会把函数定义为外部连接。这样可能会影响某些编译器的优化——比如,自动内联。
9. 参数、返回值、局部变量
尽量使用32bit数据类型;因为多数ARM处理器的操作是32bit的,8bit或16bit回增加操作的指令数(代码1),并且这样可以保证边界对齐;
参数不要超过4个,返回值尽量是32bit数据类型,因为ARM遵循ATPCS要求,前四个参数使用寄存器(r0-r3)传递,返回值用r0传递,多余的参数用栈传递;
局部变量不要超过12个,ARM编译器通常将全局变量定位在存储空间中,局部变量分配给通用寄存器,ARM中可通用的寄存器是12个;
intwordinc(inta)????????word_inc???
{???????????ADD?a1,a1,#1???
????return?a?+?1;???MOV?pc,lr???
}?????????
shortshortinc(shorta)???short_inc???
{???????????ADD?a1,a1,#1???
????return?a?+?1;???MOV?a1,a1,LSL?#16???
}???????????MOV?a1,a1,ASR?#16??
????????????MOV?pc,lr???
??
charcharinc(chara)??char_inc???
{???????????ADD?a1,a1,#1???
????return?a?+?1;???AND?a1,a1,#ff???
}???????????MOV?pc,lr???
可以看出,?操作3?2?位变量所需的指令要少于操作8位及16?位变量。??
10. 除法
A
原创力文档

文档评论(0)