程序代码的优化细节

1、一个switch语句是否总是比一系列if-then-else语句高效?
答:(1)两者本质的区别是 if-else语句更适合于对区间(范围)的判断,而switch语句更适合于对离散值的判断。
       (2)switch用来根据一个整型值进行多路分支,并且编译器可以对多路分支进行优化,所以在多路分支时用switch比if..else if .. else结构要效率高。
                   1. 不按顺序比较,而是构造一个二分查找树(binary decision tree), 这样子比较的平均次数就会下降。
                   2. 可以做个跳转表(jump table)这样子就不需要任何比较了。switch语句在编译时编译器会提供一张跳转表,提高了查找速度。
比如如下的代码。

注意:多分支的if else语句,实际上是忌讳使用的,因为在底层指令的流水线中,if else语句会导致程序预判,将一种情况的指令装入流水线。一旦预判失败,就需要回退流水线。
与switch相比,大规模使用if else的性能差异是比较大的

如果所有选项出现概率相同的话,结论就是:5个选项(包括default)的情况下,switch和if/else if相同。低于5个选项if快,高于5给选项switch快!

2、for循环和while循环的区别
for语句把循环的条件和变化都控制在for后面的括号中(),而while必须在执行体中控制条件变化,语义上for把条件和结果区分得更明确些
很多时候用 while完成比for完成优雅的多

3、指针引用比数组索引更有效吗?
优化原理是这样的:对于一个数组a,如果要访问数组中的元素a[i],实际编译器做了如下操作*(a + i*sizeof(element)),就是说编译器先从符号表中找出数组a的首地址,之后需要计算偏移量,偏移量是有i与数组中单个元素占用空间大小相乘得出的,因此,通过a[i]取得元素的操作实际有一个乘法操作在里面。而使用指针q取元素的过程是,编译器从符号表中取出q的地址,之后从q的地址中获取到q指针指向的地址,最后访问这个元素,这样,对于指针操作就没有乘法操作,因此在对数组遍历的情况下使用指针会比数组下标快的多。

4、一个函数调用开销有多大?
切换断点和现场,开辟局部内存变量
所以,当一个函数很小且调用频繁时,应该用 函数宏或内联函数 进行替代。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值