结构化与非结构化算法 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)
的排序。只有当我发现这段代码是性能瓶颈时,才会在以后进行该优化(如果它实际上是一个带有额外 &&
的优化)。
我写了两个函数来显示从 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)
的排序。只有当我发现这段代码是性能瓶颈时,才会在以后进行该优化(如果它实际上是一个带有额外 &&
的优化)。