c 中的 case 语句效率

标签 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);
     }
}

您会注意到,#defines 的范围很大,从 -1 到 -10,000。事情进展缓慢,我想知道花几个小时将这 250 个定义重新定义为更窄(甚至连续)的范围是否可以加快速度。我一直认为编译器会以一种使它们的数值无关紧要的方式处理 case 值,但我无法找到任何讨论来验证/使该假设无效。

最佳答案

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

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

关于c 中的 case 语句效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17563733/

相关文章:

c - 打印菜单功能选择后继续打印

php - switch 语句多变量赋值不重复

c - 使用各种格式说明符打印 short int

c - 错误计算均值和标准差

计算字符串中相对于字符串长度的字母频率的 C 程序

c - 文件 c 中的多个结构

sql - 对索引、主键、唯一键的影响的详细信息

javascript - 更好的搜索算法来提高性能?

performance - 微软 Access 2010 : query slows down dramatically when using parameters

java - 如何通过不获取另一个案例的值来在 switch case 中创建 if 语句?