Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1256704
  • 博文数量: 404
  • 博客积分: 10011
  • 博客等级: 上将
  • 技术积分: 5382
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-03 16:29
文章存档

2010年(40)

2009年(140)

2008年(224)

我的朋友

分类: LINUX

2009-04-30 14:06:12

优化你的代码

提高代码的效率

inline 函数

c++中,关键字inline 可以被加入到任何函数的声明。这个关键字请求编

译器用函数内部的代码替换所有对于指出的函数的调用。这样做删去了和实际

函数调用相关的时间开销,这种做法在inline 函数频繁调用并且只包含几行代码

的时候是最有效的。

 

查询表

switch 语句是一个普通的编程技术,使用时需要注意。每一个由机器语言实

现的测试和跳转仅仅是为了决定下一步要做什么工作,就把宝贵的处理器时间

耗尽了。为了提高速度,设法把具体的情况按照它们发生的相对频率排序。换

句话说,把最可能发生的情况放在第一,最不可能的情况放在最后。这样会减

少平均的执行时间,但是在最差情况下根本没有改善。

如果每一个情况下都有许多的工作要做,那么也许把整个switch 语句用一个

指向函数指针的表替换含更加有效。

 

手工编写汇编

一些软件模块最好是用汇编语言来写。这使得程序员有机会把程序尽可能

变得有效率。

 

寄存器变量

在声明局部变量的时候可以使用register 关键字。这就使得编译器把变量放

入一个多用选的寄存器,而不是堆栈里。合适地使用这种方珐,它会为编译器

提供关于最经常访问变量的提示,会稍微提高函数的执行速度。函数调用得越

是频繁,这样的改变就越是可能提高代码的速度。

 

全局变量

使用全局变量比向函数传递参数更加有效率。这样做去除了函数调用前参数

入栈和函数完成后参数出栈的需要。实际上,任何子程序最有效率的实现是根

本没有参数。然而,决定使用全局变量对程序也可能有一些负作用。软件工程

人士通常不鼓励使用全局变量,努力促进模块化和重入目标,这些也是重要的

考虑。

 

轮询

中断服务例程经常用来提高程序的效率。然而,也有少数例子由于过度和中

断关联而造成实际上效率低下。在这些情况中,中断间的平均时间和中断的等

待时间具有相同量级。这种情况下,利用轮询与硬件设备通信可能会更好。当

然,这也会使软件的模块更少。

 

定点运算

除非你的目标平台包含一个浮点运算的协处理器,否则你会费很大的劲去操

纵你程序中的浮点数据。编译器提供的浮点库包含了一组模仿浮点运算协处理

器指令组的子程序。很多这种函数要花费比它们的整数运算函数更长的执行时

间,并且也可能是不可重入的。

 

减小代码的大小

墨菲法则指出,第一次你启用编译器的优化特性后,你先前的工作程

序会突然失效,也许自动优化最臭名昭著的是“死码删除”。这种优化会删除那

些编译器相信是多余的或者是不相关的代码,比如,把零和一个变量相加不需

要任何的计算时间。但是你可能还是希望如果程序代码执行了编译器不了解的

函数,编译器能够产生那些“不相关”的指示。

 

避免使用标准库例程

为了减少你的程序的大小,你所能做的最好的一件事情就是避免使用大的标

准库例程。很多最大的库例程代价昂贵,只是因为它们设法处理所有可能的情

况。

 

本地字长

每一个处理器都有一个本地字长,并且ANSI C C++标准规定数据类型int

必须总是对应到那个字长。处理更小或者更大的数据类型有时需要使用附加的

机器语言指令。在你的程序中通过尽可能的一致使用int 类型,你也许能够从你

的程序中削减宝贵的几百字节。

 

goto 语句

就像对待全局变量一样,好的软件工程实践规定反对使用这项技术。但是危

急的时候,goto 语句可以用来去除复杂的控制结构或者共享一块经常重复的代

码。

 

降低内存的使用

在有些情况下,限制你的应用程序的因素是RAM 而不是ROM。在这些情

况下,你想要降低对于全局变量、堆和栈的依赖。这些优化由程序员来做比用

编译器来做会更好。

由于ROM 通常比RAM 更加便宜(以每字节为基准),所以一个可接受的降

低全局数据量的策略是把常数移到ROM 中去。如果你用关键字const 声明所有

的常数,那么这可以由编译器自动完成。大部分的C/C++编译器把所有它们遇

到的常全局数据放入一个特殊的数据段里,这个数据段可以被定位器识别为可

分配ROM 的数据段。如果有很多的字符串和导向表数据在运行的时候不发生变

化,那么这项技术是最有价值的。

 

限制C++的影响

 

阅读(657) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~