C:提高C代码运行效率的方法有哪些?列举几个提高代码执行效率的方法


1.选择合适的算法

应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相应的参考资料,有很多计算机书籍上都有介绍。


举例:
将比较慢的顺序查找法用较快的二分查找或乱序查找法代替,插入排序或冒泡排序法用快速排序、合并排序或根排序代替,都可以大大提高程序执行的效率。

2.选择合适的数据结构

选择一种合适的数据结构也很重要,比如你在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多。


1)数组与指针:
数组与指针语句具有十分密切的关系,一般来说,指针比较灵活简洁,而数组则比较直观,容易理解。对于大部分的编译器,使用指针比使用数组生成的代码更短,执行效率更高。

3.选择合适的数据类型

1)选择尽量小的数据类型
能够使用字符型(char)定义的变量,就不要使用整型(int)变量来定义;能够使用整型变量定义的变量就不要用长整型(long int),能不使用浮点型(float)变量就不要使用浮点型变量。否则会造成内存浪费,而且运算时效率要低一些。
当然,在定义变量后不要超过变量的作用范围,如果超过变量的范围赋值,C编译器并不报错,但程序运行结果却错了,而且这样的错误很难发现。


2)使用无符号整数,而不是整数
有些处理器可以处理无符号的整数,比有符号整数的运算速度要快。(这也是很好的实践,帮助self-documenting代码)


3)局部变量与全局变量
全局变量优点:使用全局变量比函数传递参数更加有效率。这样做去除了函数调用参数入栈和函数完成后参数出栈所需要的时间。当然,使用全局变量会对程序有一些负作用。

4.减少冗余拷贝或赋值次数

1)参数减少值传递,多用指针/引用传递方式
函数执行时会将参数存放在栈中,这个过程中参数传递会耗时。如果传递的参数是int类型,可能对性能影响还不是很大。但如果传递的参数是一个较大的结构体,其效率问题就不言而喻了。相对应的,指针作为参数传递只把结构体地址存放在栈中,在数据结构较大时,效率优化很明显。
例如:
bool Compare (string s1, string s2)
bool Compare (string *s1, string *s2)
指针的形式,更能提高程序运行效率。


2)减少冗余拷贝
数据拷贝会将数据从一块内存拷贝到另一块内存。如果改成用指针,将数据的内存地址进行传递,同样能获取到数据,效率指针要快很多。
当然,必要的拷贝操作还是不能少的。


3)减少产生临时变量的情况
目前遇到的一些产生临时变量的情况:函数传参、函数返回值、隐式类型转换、多余的拷贝、赋值等。
一句话:少赋值/拷贝,多传递指针。

5.减少运算的强度

1)善用自加、自减
使用自加、自减指令和复合赋值表达式(如a-=1及a+=1等)都能够生成高质量的程序代码。在使用到加一和减一操作时尽量使用增量和减量操作符,因为增量符语句比赋值语句更快,原因在于对大多数CPU来说,对内存字的增、减量操作不必明显地使用取内存和写内存的指令,比如下面这条语句:
x=x+1;
模仿大多数微机汇编语言为例,产生的代码类似于:
move A,x ; //把x从内存取出存入累加A
add A,1 ; //累加器A加1
store x ; //把新值存回x
如果使用增量操作符,生成的代码下:
incr x ; //x加1
显然,不用取指令和存指令,增、减量操作执行的速度加快,同时长度也缩短了。


2)使用运算量小但功能相同的表达式替换原来复杂的的表达式
善用位运算,如下:
a=a%8;
可以改为:
a=a&7;
位操作只需一个指令周期即可完成(更贴近于代码语言),而大部分的C编译器的“%”运算均是调用子程序来完成,代码长、执行速度慢。
善用移位实现乘除法运算,如下:
a=a4;
b=b/4;
可以改为:
a=a<<2;
b=b>>2;
通常如果需要乘以或除以2n,都可以用移位的方法代替。用移位的方法得到代码比调用乘除法子程序生成的代码效率高。实际上,只要是乘以或除以一个整数,均可以用移位的方法得到结果,如:
a=a
9
可以改为:
a=(a<<3)+a

6.减少循环内耗时操作

1)减少循环内定义
将没有必要执行多次的操作全部把它们放到循环外面,这里包括表达式、函数的调用、指针运算、数组访问等。循环内的重复定义/计算,会造成内存浪费,而且运算时效率要低一些。 如:
for(int i = 0; i < strlen(s); ++i)
{
ClassTest CT = a;
//do something
}


思考:
++i与i++哪个运行效率更高?
do…while与while哪个运行效率跟高?

7.其它

1)减少跳转和切换等操作
Inline关键字请求编译器用函数内部的代码替换所有对于指出的函数的调用。这样做在两个方面快于函数调用。这样做在两个方面快于函数调用:
第一,省去了调用指令需要的执行时间;
第二,省去了传递变元和传递过程需要的时间。

但是使用这种方法在优化程序速度的同时,程序长度变大了,因此需要更多的ROM。使用这种优化在Inline函数频繁调用并且只包含几行代码的时候是最有效的。


2)查表
在程序中一般不进行非常复杂的运算,如浮点数的乘除及开方等,以及一些复杂的数学模型的插补运算,对这些即消耗时间又消费资源的运算,应尽量使用查表的方式,并且将数据表置于程序存储区。如果直接生成所需的表比较困难,也尽量在启了,减少了程序执行过程中重复计算的工作量。


收录于:
嵌入式软件/BSP开发工程师/Linux驱动工程师/C语言经典笔试面试题大全

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Evan_ZGYF丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值