去年做性能优化的时候写过一篇与switch优化相关的文章http://www.trueeyu.com/?p=1156,今天无意中看到了一篇感觉不错,翻译一下。

将case限定在一个小的范围

对于switch…case语句,如果case相差比较小的话的话,如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
switch (value)
{
case 1:
...
break;
case 2:
...
break;
case 4:
...
break;
case 5:
...
break;
default:
break;
}

编译器会将会生成一张索引表,而不是if-else-if,这样生成的代码会比if-else-if要快,而且性能与case的条目数没有关系,所以尽量将case限定在一个小的范围,不要出现下面这种:

1
2
3
4
5
6
7
8
9
10
switch (value)
{
case 1:
..
break;
case 100:
..
break;
....
}

当case相差很大时,经常发生的case放在前面

如果case相差比较大,如下这种:

1
2
3
4
5
6
7
8
9
10
switch (value)
{
case 1:
..
break;
case 100:
..
break;
....
}

最终将会生成if–else–if语句,将最常发生的case放在前面,可以减少比较次数

将大的switch语句拆成嵌套的switch

有的编译器,并不是按照case的书写顺序生成if–else–if,所以写在前面也不会先判断,这样的话,使用嵌套switch可以解决
假设1,2,5是经常发生,3,4不是经常发生的话,可以这样写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
switch (value)
{
case 1:
..
break;
case 2:
..
break;
case 5:
..
break;
default:
switch (value)
{
case 3:
..
break;
case 4:
..
break;
defalut:
break;
}
break;
}

参考文章

http://www.eventhelix.com/realtimemantra/basics/optimizingcandcppcode.htm#Break Big Switch Statements into Nested Switches

Comments

2014-06-18