Pae*_*ula 6 c performance switch-statement
我在Visual C中有一个大的switch语句,大约250个案例:
#define BOP -42
#define COP -823
#define MOP -5759
int getScarFieldValue(int id, int ivIndex, int rayIndex, int scarIndex, int reamIndex)
{
int returnValue = INT_MAX;
switch (id)
{
case BOP : returnValue = Scar[ivIndex][rayIndex].bop[scarIndex][reamIndex]; break;
case COP : returnValue = Scar[ivIndex][rayIndex].cop[scarIndex][reamIndex]; break;
case MOP : returnValue = Scar[ivIndex][rayIndex].mop[scarIndex][reamIndex]; break;
.....
default: return(INT_MAX);
}
}
Run Code Online (Sandbox Code Playgroud)
你会注意到#defines有一个很大的范围,从-1到-10,000.事情是狗慢,我想知道花几个小时重新定义这250个定义到更窄(甚至连续)的范围可以加快速度.我一直认为编译器会以一种使其数值无关的方式处理案例值,但我无法找到任何讨论来验证/使该假设无效.
反汇编编译后的代码,看看编译器做了什么。我查看了几个不同编译器的输出,大型 switch 语句总是被编译成二进制决策树或跳转表。跳转表是您可以获得的最优化的东西,如果您要打开的值在一个狭窄的范围内,它们更有可能由编译器生成。它还有助于在某些编译器上设置默认语句(但在其他编译器上则不必要)。
在这种情况下,反汇编是唯一好的选择,这一级别的代码生成细节很少有详细记录。
归档时间: |
|
查看次数: |
1009 次 |
最近记录: |