结构化与非结构化算法JavaScript

结构化与非结构化算法JavaScript,javascript,analysis,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

我编写了两个函数来显示从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的执行时间为:20ms

差别大约是1/3

我有两个问题:

1比较之前的i%5===0和之后的i%3==0或反之更好吗

2 func2的执行时间优于func1,但func2的代码是非结构化的 我有多个退出点的函数continue关键字被认为是一个go to。 问题是:我应该保留我的结构化代码而忽略执行时间吗?或者,如果我需要
性能好,我能写这种代码吗?

所有的注释都是正确的。这里根本没有特别的性能考虑。因此,首先编写可读的代码。像这样的怎么样

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&&!嗡嗡声如果巴斯&!商业。。。如果业务和嗡嗡声。如果它实际上是一个带有额外&&的优化,那么只有当我发现这段代码是一个性能瓶颈时,才会在以后进行优化。

对于任何事情来说,执行时间都太少了。节省的最大时间是记忆除法结果,尽管运行时可能会这样做,而不是重复i%5和i%3两次。您的浏览器一定很慢,我的浏览器使用1.655毫秒,也就是略高于千分之一秒,因此,换句话说,除非您打算将函数运行一万亿次,否则这一点都不重要。由于反复强调的警告是,优化做这一点的代码是毫无意义的,因此最有帮助的是将那些console.log调用移出测试。让测试生成一个字符串,然后在循环结束时调用一个console.log以打印结果。您对控制台的基准测试多于对应用程序逻辑的基准测试。另外,三分之一的“不太多”也不是很大。不要对少量使用百分比,这可能会产生误导。如果一个进程需要2ms,另一个进程需要1ms,这意味着它们都是即时的,而不是一个进程的速度总是另一个进程的一半……如果测量到5-8%的差异,则不需要优化。选择一个最可读、最易于维护且与代码其余部分一致的代码。性能是你在这里最不需要考虑的事情。我现在有一个明确的想法。。谢谢你的回答。