【问题标题】:Enum parameter function and switch optimization枚举参数函数和开关优化
【发布时间】:2011-06-20 17:27:00
【问题描述】:

如何优化这样的代码: ENUM_ELEM 是枚举的元素,我想避免这样的开关

short int f(short int b){
    switch(b){
        case ENUM_ELEM1 : return -12;
        case ENUM_ELEM2 : return 0;
        case ENUM_ELEM3 : return 12;
    }
}

【问题讨论】:

  • 你想优化它做什么?运行时性能、可读性、简洁性?如果是性能,您认为当前性能有哪些可以改进的地方?
  • 发布枚举的定义。优化可能取决于它们的值,以及有多少值。
  • 我对你的问题投了反对票,因为你没有发布枚举的定义,即使在我要求它之后,即使它只包含 3 个值!你发布它有什么困难?

标签: c++ c optimization


【解决方案1】:

如果你的ENUM_ELEM#在低范围内,那么你可以使用一个表,并使用枚举值作为表的索引来获取返回值。

但我可以想象一些聪明的编译器可能会自行优化代码......

不要忘记优化的三个规则:测量、测量、测量。

【讨论】:

    【解决方案2】:

    几个选项:

    如果您的枚举值是连续的默认值(即:0,1,2) - 制作表格:

    int translate[ENUM_ELEM3] = {-12,0,12};
    return translate[ENUM_VALUE];
    

    或者,#define 它们为 -12,0,12,无论如何你传递的是 short int,而不是 enum

    IIRC 新标准 (c++0x) 允许 enum 值为负数,检查你的编译器是否支持它,那么你根本不会有问题。

    【讨论】:

    【解决方案3】:

    如果您的枚举很紧凑,请使用查找表

    【讨论】:

      【解决方案4】:

      如果这是关于代码质量/可维护性 w.r.t. OOP,您可能想研究重构“用多态性替换条件”。

      在性能优化的情况下(在您验证应用程序的真正瓶颈之前,您不应该关心它,并且您也不应该过早关心它们),您可以使用一个很好的旧查找表,只需让它像 0 一样放在那里,或者(再次)让它放在那里因为你的 CPU 不到 15 年 1


      0 编译器已经优化了许多 switch 语句(但你可能想看看你的编译器实际上为你做了什么)

      1 推测执行、分支预测和您的分支目标缓冲区可能比您和编译器更好

      【讨论】:

        【解决方案5】:

        假设 ENUM_ELEM1 的值为负,ENUM_ELEM2 的值为 0,ENUM_ELEM3 的值为正。

        那么您可能希望通过以下方式重构以提高可读性:

        static final short unPos = (short)(1 << 15);
        
        static short f(short b)
        {
            return (short)(b == 0 ? 0 : (b &= unPos) == unPos ? -12 : 12);
        }
        

        请注意我是用 Java 实现的,但我猜你会找到你选择的语言的相应语法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多