我写了两个函数来显示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关键字被认为是首选)。 问题是:我应该保留我的结构化代码并忽略执行时间,或者,如果我需要一个 性能良好,我可以写这种代码吗?
答案 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)
的排序。如果我发现这段代码是性能瓶颈,那么优化(如果它实际上实际上是一个额外的&&
)只会在以后完成。