Switch case中的case顺序
Switch 可能转化成多种不同算法的代码。其中最常见的是跳转表和比较链/树。当switch用比较链的方式转化时,编译器会产生if-else-if的嵌套代码,并按照顺序进行比较,匹配时就跳转到满足条件的语句执行。所以,可以对case的值依照发生的可能性进行排序,把最有可能的放在第一位,这样可以提高性能。
此外,在case中推荐使用小的连续的整数,因为在这种情况下,所有的编译器都可以把switch 转化成跳转表。
不好的代码:
int days_in_month, short_months, normal_months, long_months;
......
switch (days_in_month)
{
case 28:
case 29:
short_months ++;
break;
case 30:
normal_months ++;
break;
case 31:
long_months ++;
break;
default:
cout < < "month has fewer than 28 or more than 31 days" < < endl;
break;
}
推荐的代码:
int days_in_month, short_months, normal_months, long_months;
......
switch (days_in_month)
{
case 31:
long_months ++;
break;
case 30:
normal_months ++;
break;
case 28:
case 29:
short_months ++;
break;
default:
cout < < "month has fewer than 28 or more than 31 days" < < endl;
break;
}
提升循环的性能
要提升循环的性能,减少多余的常量计算非常有用(比如,不随循环变化的计算)。
不好的代码(在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()的值,这样可以避免重复计算。虽然不好的代码中的分支可以简单地预测,但是由于推荐的代码在进入循环前分支已经确定,就可以减少对分支预测的依赖。
选择好的无限循环写法
在编程中,我们常常需要用到无限循环,常用的两种方法是while (1)
和for (;;)
。这两种方法效果完全一样,但哪一种更好呢?让我们看看它们编译后的代码。
编译前:
while (1);
编译后:
mov eax,1
test eax,eax
je foo+23h
jmp foo+18h
编译前:
for (;;);
编译后:
jmp foo+23h
显然,for (;;)
指令少,不占用寄存器,而且没有判断、跳转,比while (1)
好。
全部0条评论
快来发表一下你的评论吧 !