结构化与非结构化算法JavaScript
我编写了两个函数来显示从1到20的数字,并指出哪些是3的倍数,哪些是5的倍数,哪些是两者的倍数,哪些不是 我决定写一个尽可能节省时间的函数 我得到了这两个函数: 第一个:结构化与非结构化算法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
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%的差异,则不需要优化。选择一个最可读、最易于维护且与代码其余部分一致的代码。性能是你在这里最不需要考虑的事情。我现在有一个明确的想法。。谢谢你的回答。