结构化与非结构化算法JavaScript

时间:2015-01-13 18:11:20

标签: javascript analysis

我写了两个函数来显示1到20之间的数字,并告诉它们是3的倍数,它们是5的倍数,它们都是两个并且不是。

我决定编写尽可能少花费时间的功能。

我有这两个功能:

第一个:

function func1(){
console.time('execution time:');

for ( var i=1 ; i<=20; i++)
    if((i%5)===0 && (i%3)===0)
      console.log("\n" + i + " : Multiple of 5 and 3.");
    else{
        if(i%3===0)
            console.log("\n" + i + " : Multiple of 3.");
        else{
            if(i%5===0)
        console.log("\n" + i + " : Multiple of 5.");
            else
                console.log("\n" + i);
        }
    }
console.timeEnd('execution time:');

}

第二个是:

function func2(){
    console.time('execution time:');

    for ( var i=1 ; i<=20; i++){

        if((i%5)===0 && (i%3)===0){
          console.log("\n" + i + " : Multiple of 5 and 3.");
          continue;
        }


        if(i%3===0){
            console.log("\n" + i + " : Multiple of 3.");
            continue;
        }

        if(i%5===0)
            console.log("\n" + i + " : Multiple of 5.");
        else
            console.log("\n" + i);

   }   

   console.timeEnd('execution time:');
}

func1()的执行时间为:29ms

func2()的执行时间为:20ms

差异很大,约为1/3。

我有两个问题:

1)比较i%5 === 0之前然后i%3 === 0或者反之?

2)func2()的执行时间比func1()好,但func2()的结构非结构化因为     我有多个函数的退出点(continue关键字被认为是首选)。     问题是:我应该保留我的结构化代码并忽略执行时间,或者,如果我需要一个     性能良好,我可以写这种代码吗?

1 个答案:

答案 0 :(得分:0)

所有评论都是对的。在这里担心没有特别的性能考虑因素。所以编写首先可读的代码。这样的事情怎么样呢?:

function func3() {
    for (var i = 1; i <= 20; i++) {
        var biz = (i % 3 === 0);
        var buzz = (i % 5 === 0);
        if (biz && buzz) {
            console.log("\n" + i + " : Multiple of 5 and 3");
        } else if (biz) {
            console.log("\n" + i + " : Multiple of 3");
        } else if (buzz) {
            console.log("\n" + i + " : Multiple of 5");
        } else {
            console.log("\n" + i);
        }            
    }
}

事实上,已经在此代码中编写了一个小优化。因为我知道3的倍数多于5的倍数,所以我将biz分支放在buzz分支之前。但我不打扰用其他优化来混淆代码并使用if (biz && ! buzz) ... if (buzz && ! biz) ... if (biz && buzz)的排序。如果我发现这段代码是性能瓶颈,那么优化(如果它实际上实际上是一个额外的&&)只会在以后完成。