结构化与非结构化算法 JavaScript

Structured vs. Unstructured Algorithm JavaScript

我写了两个函数来显示从 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() 的执行时间为:29 毫秒

func2() 的执行时间为:20 毫秒

相差1/3左右

我有两个问题:

1) 是先比较i%5===0再比较i%3===0还是反之比较好?

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

所有评论都是正确的。这里根本没有特别的性能考虑因素需要担心。所以首先编写可读的代码。换成这样怎么样?:

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) 的排序。只有当我发现这段代码是性能瓶颈时,才会在以后进行该优化(如果它实际上是一个带有额外 && 的优化)。