C语言代码优化
2012-08-21 22:19
120 查看
(1)Switch语句中根据发生频率来进行case排序
Switch 可能转化成多种不同算法的代码。其中最常见的是跳转表和比较链/树。当switch用比较链的方式转化时,编译器会产生if-else-if的嵌套代码,并按照顺序进行比较,匹配时就跳转到满足条件的语句执行。所以可以对case的值依照发生的可能性进行排序,把最有可能的放在第一位,这样可以提高性能。此外,在case中推荐使用小的连续的整数,因为在这种情况下,所有的编译器都可以把switch 转化成跳转表。
(2)while循环和do…while循环
用while循环时有以下两种循环形式:
unsigned int i;
i=0;
while (i<1000)
{
i++;
//用户程序
}
或:
unsigned int i;
i=1000;
do
{
i--;
//用户程序
}
while (i>0);
在这两种循环中,使用do…while循环编译后生成的代码的长度短于while循环。
(3)提升循环的性能
要提升循环的性能,减少多余的常量计算非常有用(比如,不随循环变化的计算)。
不好的代码(在for()中包含不变的if()):
for( i 。。。 )
{
if( CONSTANT0 )
{
DoWork0( i ); // 假设这里不改变CONSTANT0的值
}
else
{
DoWork1( i ); // 假设这里不改变CONSTANT0的值
}
}
推荐的代码:
if( CONSTANT0 )
{
for( i 。。。 )
{
DoWork0( i );
}
}
else
{
for( i 。。。 )
{
DoWork1( i );
}
}
如果已经知道if()的值,这样可以避免重复计算。虽然不好的代码中的分支可以简单地预测,但是由于推荐的代码在进入循环前分支已经确定,就可以减少对分支预测的依赖。
(4)选择好的无限循环
在编程中,我们常常需要用到无限循环,常用的两种方法是while (1) 和 for (;;)。这两种方法效果完全一样,但那一种更好呢?然我们看看它们编译后的代码:
编译前:
while (1);
编译后:
mov eax,1
test eax,eax
je foo+23h
jmp foo+18h
编译前:
for (;;);
编译后:
jmp foo+23h
显然,for (;;)指令少,不占用寄存器,而且没有判断、跳转,比while (1)好。
Switch 可能转化成多种不同算法的代码。其中最常见的是跳转表和比较链/树。当switch用比较链的方式转化时,编译器会产生if-else-if的嵌套代码,并按照顺序进行比较,匹配时就跳转到满足条件的语句执行。所以可以对case的值依照发生的可能性进行排序,把最有可能的放在第一位,这样可以提高性能。此外,在case中推荐使用小的连续的整数,因为在这种情况下,所有的编译器都可以把switch 转化成跳转表。
(2)while循环和do…while循环
用while循环时有以下两种循环形式:
unsigned int i;
i=0;
while (i<1000)
{
i++;
//用户程序
}
或:
unsigned int i;
i=1000;
do
{
i--;
//用户程序
}
while (i>0);
在这两种循环中,使用do…while循环编译后生成的代码的长度短于while循环。
(3)提升循环的性能
要提升循环的性能,减少多余的常量计算非常有用(比如,不随循环变化的计算)。
不好的代码(在for()中包含不变的if()):
for( i 。。。 )
{
if( CONSTANT0 )
{
DoWork0( i ); // 假设这里不改变CONSTANT0的值
}
else
{
DoWork1( i ); // 假设这里不改变CONSTANT0的值
}
}
推荐的代码:
if( CONSTANT0 )
{
for( i 。。。 )
{
DoWork0( i );
}
}
else
{
for( i 。。。 )
{
DoWork1( i );
}
}
如果已经知道if()的值,这样可以避免重复计算。虽然不好的代码中的分支可以简单地预测,但是由于推荐的代码在进入循环前分支已经确定,就可以减少对分支预测的依赖。
(4)选择好的无限循环
在编程中,我们常常需要用到无限循环,常用的两种方法是while (1) 和 for (;;)。这两种方法效果完全一样,但那一种更好呢?然我们看看它们编译后的代码:
编译前:
while (1);
编译后:
mov eax,1
test eax,eax
je foo+23h
jmp foo+18h
编译前:
for (;;);
编译后:
jmp foo+23h
显然,for (;;)指令少,不占用寄存器,而且没有判断、跳转,比while (1)好。
相关文章推荐
- 如何优化C语言代码(程序员必读)
- 如何优化C语言代码(程序员必读)
- 单片机C语言代码优化
- 优化C语言代码范例
- 如何优化C语言代码(程序员必读)
- 如何优化C语言代码
- 如何优化C语言代码
- 关于优化C语言代码
- 优化C语言代码常用的几招 .
- [转帖]如何优化C语言代码(程序员必读)
- 优化C语言代码常用的几招
- 最基本的C语言代码级别速度优化
- 优化C语言代码
- 优化C语言代码(程序员必读)
- 优化C语言代码(程序员必读) ( 转载 )
- 几种C语言优化代码技巧
- 如何优化C语言代码
- 优化C语言代码(程序员必读)(转载)http://www.yuanma.org/data/2009/1126/article_4036.htm
- 优化快速排序 C语言代码
- 优化C语言代码(程序员必读)