优化C语言程序

        无论是普通的应用程序,还是内核程序,亦或嵌入式程序,最后都会有性能上的考虑。近来对于如何提高C语言程序的执行效率比较感兴趣,这里进行记录,希望能够提供一些编码指导给大家(其它语言的程序也有这方面的考虑,道理一样)。

        C语言编写之后的程序往往可以进行优化,经过优化后的性能能够得到很大的提升(参考《编程珠玑》)。好的研发人员,总是对编写好的程序进行不断优化,这样对于自己维护的模块会更加熟悉,同时能够提高模块的效率和稳定性。接下来从六个方面举例来说明如何去优化,整个顺序由重要到次要。顾名思义,优化就是将不好的地方变好,所以我们在优化的过程中要把握一个原则:先找到需要优化的地方。程序在运行过程中存在着2-8原则,即80%的计算资源花费在20%的代码上,我们需要找出这20%的代码进行优化,提升性能。

(1)数学方法的使用。可以说,计算机科学是建立在数学的基础上,所以说数学方法的使用,既体现了研发人员的理论基础深厚,使模块的逻辑非常健壮,又能起到优化程序的目的。例如常常使用的累加程序,计算从1到10000的整数和。一般的思路是采用for循环,逐个累加,但是灵活的研发人员会采用代数求和公式,直接获得整数和。

(2)算法的不断改进。算法跟前面提到的数学方法很为类似,但是数学方法强调的是理论,而算法则是做事情的方法。算法一词最早的来源是数学家花喇米子,从这里也可以看出算法跟数学的渊源。这方面最直观的例子是查找,大数据量下对比顺序查找和二分查找可以发现二分查找能够很大程度提高程序的性能。这里的二分查找还可以进一步进行优化,如果说你的查找对象服从某种特殊的概率分布或者硬件平台有某种并行特征,你可以采用N(N>2)分查找,程序的性能会进一步提升,带来的副作用就是可维护性差,对研发人员要求较高。

(3)巧用数据结构。数据结构是程序的核心之一,如果说某个数据项经常被申请或者释放,那么你就要考虑采用预分配和设置标志位这些操作了。另外数组、链表等常见的数据结构的区别和优劣也是研发人员要熟记于心的。

(4)变量使用也是一门学问。这门学问并不难,但考验研发人员的细心和记忆,属于一个积累过程。全局变量是C语言程序中经常使用的一种模块间通信的技术,但是在函数内部全局变量的使用是有很多要注意的。因为全局变量在函数内部,程序执行过程中并不是存储在寄存器中,这样的话一旦全局变量用于较长次数的循环中,从内存存取次数将非常多,造成性能的降低。有经验的研发人员会在函数里面声明局部变量,然后将全局变量的值赋给它,这样就可以充分利用寄存器这个硬件结构。

(5)循环之美。C语言是一门语言,它的语义要素之一就是循环。一个程序里面循环通常会有很多,往往很多计算资源就花费在循环上面。例如做10000次循环操作,两种书写方式,for( i=0; i<10000; i++)和for(i=10000; i!=0; i--),从汇编代码来看,后者明显效率要高。

(6)复用已有代码。工程里面很多东西都不能纯理论化,有时候为了性能会牺牲一些设计上的考虑,这时候你就要有复用概念,因为经过实际检验的代码,往往比自己从头写一遍要保险和合适一点。当然这方面主要是从做产品和实际的东西考虑,算法研究或者软件预研则较少涉及这个方面。

 

总结:上面提到的这些优化方法是每个研发人员或多或少会遇到的,关键是掌握一个度。优化的过程同时也是能力积累的一个过程,研发人员对软件的理解就是在不断优化和改进上提升的,一味的编码和设计,没有思考时间,都是无益有害的。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值