0

我用java编写了一个程序,其中一部分必须评估蛋白质序列中的切割。我必须评估分裂是否发生在两端的某些组中,这会导致 if、else/elseif 语句在几个地方带有烦人的逻辑、嵌套或只有几个“if”和/或“else”。我使用 switch 作为每次发生分裂时必须评估几个“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;
}
4

1 回答 1

3

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

使用 aswitch而不是if链可能是有益的……也可能不是。这在很大程度上取决于上下文。

唯一可以确定的方法是仔细地对代码进行基准测试,比较有和没有潜在优化的版本。首先进行概要分析也是一个好主意,这样您就不会浪费时间优化无关紧要的代码。

请注意,给定微优化的效果可能会因您的实际执行硬件、操作系统和 JVM 版本/风格而异。(可能还有其他事情......比如有多少物理内存可用以及堆有多大。)预测第一原理的好处是困难的,而且平台变化总是有可能否定你所有的手动调整工作.

于 2012-06-28T00:38:30.763 回答