我正在写一个nodejs堆,性能真的很重要。我有以下代码:
while(true)
if(x)
do something
return
if(y)
do ...
return
if(z)
do ...
else
return
建议我使用
打破
代替
返回
并在结尾处放一个单引号,以避免重复的代码并使代码更具可读性。性能会下降吗?如果有的话,那有什么意义吗?
换一种说法:
仅在循环中使用中断是否有缺点
在循环后使用return而不是在第一个循环中使用return
地点?
最佳答案
我编写了以下代码,以尝试测试此问题:
// license: public domain
var mode = process.argv[2] === 'break' ? false : true;
var iterations = process.argv[3] ? process.argv[1] : 1e9;
var testIterations = process.argv[4] ? process.argv[2] : 1e4;
var number;
var range = 1e9;
function testA () {
for (var i = 0; i < testIterations; i++) {
number = Math.floor(Math.random() * range);
if (Math.floor(number/2) === number/2) {
number = number/2;
return number;
}
if (number * number > number + number) {
number = number * 2;
return number;
}
if (number) {
number = Math.pow(2, Math.ceil(Math.random()*16));
return number;
}
if (1 === true || 1 == true) {
number = number - number*number + Math.pow(number, Math.PI);
return number;
}
}
}
function testB () {
for (var i = 0; i < testIterations; i++) {
number = Math.floor(Math.random() * range);
if (Math.floor(number/2) === number/2) {
number = number/2;
break;
}
if (number * number > number + number) {
number = number * 2;
break;
}
if (number) {
number = Math.pow(2, Math.ceil(Math.random()*16));
break;
}
if (1 === true || 1 == true) {
number = number - number*number + Math.pow(number, Math.PI);
break;
}
}
return number;
}
console.log('benchmarking ' + (mode ? 'return' : 'break'));
console.time('benchmark');
if (mode) {
for (var i = 0; i < iterations; i++) {
var result = testA();
}
} else {
for (var i = 0; i < iterations; i++) {
var result = testB();
}
}
console.timeEnd('benchmark');
执行后,我得到了以下结果(5个样本):
基准测试中断:
22262ms
基准回报率:
21947ms
基准测试中断:
22549ms
基准回报率:
22180ms
基准测试中断:
22443ms
基准回报率:
22143ms
基准测试中断:
22304ms
基准回报率:
22109ms
基准测试中断:
22293ms
基准回报率:
22003ms
总计:中断:
111851ms
,返回:110382ms
,差值:1469ms
(1.3%
)如果该基准代码与您的基准代码相似,那么我可以肯定地说,这两个版本之间没有明显的性能差异。
关于javascript - break + return vs return Javascript Node.js,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31428556/