优化开关结构 - 如何避免添加if子句

时间:2014-09-19 15:41:05

标签: c++ c performance optimization refactoring

我正在尝试优化我必须重构的代码。没有任何优化的代码会有一些switch语句。如果在switch语句中发生错误,则会向调用方法返回错误,例如:

switch(var)
{ 
    case VAL1: 
    //do something... 
    break; 
    case VAL2: 
    //do something else... 
    //... 
    case VAL3: 
    if (...) // there is any case that can cause error 
    { 
         return error1;
    }
    break; 
    case VAL4: 
    if (...) // there is any case that can cause error 
    { 
         return error2;
    }
    break;
    case VAL5: 
    if (...) // there is any case that can cause error 
    { 
         return error1;
    }
    break;
    //and so on... 
    default: 
         break; 
} 

我正在重构代码,所以我没有在switch语句中返回错误,而是我在标记变量中存在错误:

int error_type = -1; 

switch(var)
{ 
    case VAL1: 
    //do something... 
    break; 
    case VAL2: 
    //do something else... 
    //... 
    case VAL3: 
    if (...) // there is any case that can cause error 
    { 
         error_type = error1;
    }
    break; 
    case VAL4: 
    if (...) // there is any case that can cause error 
    { 
         error_type = error2;
    }
    break;
    case VAL5: 
    if (...) // there is any case that can cause error 
    { 
         error_type = error1;
    }

    break;
    //and so on... 
    default: 
         break; 
}

if (error_type != -1) 
       return error_type; 

当没有错误时会出现问题,因为我们正在添加另一个if语句,如果每秒多次调用该方法会导致性能问题。我想避免每次检查病情。有什么建议我可以改进这段代码吗?任何转换重构技巧?

//编辑:我知道这个例子可能看起来很愚蠢(因为重构不会看起来非常有用)但是我重构的实际代码确实需要它(相信我)所以我试着不要最终代码中的松散性能。

1 个答案:

答案 0 :(得分:2)

一般的经验法则是switch语句可以被查找表或数组替换。这些表的一个优点是,它们可以很容易地以极低的性能成本进行更新,并且对查找功能(引擎)几乎没有任何修改。

以下是一些想法:

如果条件检查有模式,请将变量放入表中。让引擎执行检查。

将函数指针放入表中以执行检查。如果函数指针为NULL,则表示没有检查。