Switch的效率是否值得将它用于嵌套条件而不是if,else?

时间:2012-06-28 00:16:50

标签: java if-statement switch-statement

我在java中编写程序,其中一部分必须评估蛋白质序列中的切割。 我必须评估解理是否发生在任一端的某些组上,这导致if,else / elseif语句在几个地方具有恼人的逻辑,嵌套,或者只是几个“if”和/或“else”。我已经使用开关作为每次解理时必须评估几个“if”和逻辑(&&,||)的替代方法(这个循环将迭代数百万次,可能数十或数亿)

继承了代码块: -.getSeq()获取一个表示蛋白质序列的字符串 -startPos和endPos是两端分裂的索引 - 如果if语句行被分成多行或者是错综复杂的,那么也是如此,但这就是我的情况并指出了逻辑。

/**0: non-tryptic, 1: half-tryptic, 2: fully tryptic**************/
public boolean checkPep(int trypticity){
    boolean evaluator = false;
    int prev = 0;
    if (startPos != 0){
        prev = 1;
    }
    switch(trypticity){
/**do not check cleavage if peptide can be non-tryptic*/
    case 0:
        evaluator = true;
        break;
/***half-tryptic*/
/**check if either the start OR end cleavage is tryptic*/
    case 1:
        switch(protein.getSeq().charAt(startPos-prev)){
        case 'K':
            evaluator = true;
            break;
        case 'R':
            evaluator = true;
            break;
        default :
            switch(protein.getSeq().charAt(endPos)){
            case 'K':
                evaluator = true;
                break;
            case 'R':
                evaluator = true;
                break;
            default:
                evaluator = false;
                break;
            }
            break;
        }
        break;
/**fully tryptic*/
/**if first cleavage is tryptic, check end cleavage*/
/**evaluator = true IFF both cleavages are tryptic*******/
    case 2:
        if(((protein.getSeq().charAt(startPos-1)) == 'K') || ((protein.getSeq().charAt(startPos-1)) == 'R')){
            if(((protein.getSeq().charAt(endPos)) == 'K') || ((protein.getSeq().charAt(endPos)) == 'R')){
                evaluator = true;
            }else{
                evaluator = false;
            }
        }else{
            evaluator = false;
        }
        break;
    }
    return evaluator;
}

1 个答案:

答案 0 :(得分:3)

这种事情就是我们所谓的微观优化。

使用switch代替if链可能是有益的......或者可能不是。这在很大程度上取决于具体情况。

唯一可以确定的方法是仔细地对代码进行基准测试,比较具有和不具有潜在优化的版本。最好先分析 ,这样就不会浪费时间来优化真正无关紧要的代码。

请注意,给定的微优化的影响可能取决于您的实际执行硬件,操作系统和JVM版本/风格。 (还有其他一些东西......比如可用的物理内存量和堆的大小。)预测第一原则带来的好处很难,并且平台更改总是可以否定所有的手动调整工作