案例陈述效率c

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个定义到更窄(甚至连续)的范围可以加快速度.我一直认为编译器会以一种使其数值无关的方式处理案例值,但我无法找到任何讨论来验证/使该假设无效.

Art*_*Art 2

反汇编编译后的代码,看看编译器做了什么。我查看了几个不同编译器的输出,大型 switch 语句总是被编译成二进制决策树或跳转表。跳转表是您可以获得的最优化的东西,如果您要打开的值在一个狭窄的范围内,它们更有可能由编译器生成。它还有助于在某些编译器上设置默认语句(但在其他编译器上则不必要)。

在这种情况下,反汇编是唯一好的选择,这一级别的代码生成细节很少有详细记录。