中断+;返回vs返回Javascript节点

中断+;返回vs返回Javascript节点,javascript,node.js,performance,optimization,Javascript,Node.js,Performance,Optimization,我正在写一个nodejs堆,性能非常重要。我有以下代码: while(true) if(x) do something return if(y) do ... return if(z) do ... else return 有人建议我使用 中断 而不是 返回 并在末尾添加一个返回,以避免重复代码并提高可读性。是否有性能下降,如果有,是否有任何重大影响 换言之: 仅在循环中使用中断是否有缺点 在循环后使用return而不是在第一个循环中使用return 地点 我能想到的主要区别是在函

我正在写一个nodejs堆,性能非常重要。我有以下代码:

while(true)
if(x)
 do something
 return
if(y)
 do ...
 return
if(z)
 do ...
else
 return
有人建议我使用

中断

而不是

返回

并在末尾添加一个返回,以避免重复代码并提高可读性。是否有性能下降,如果有,是否有任何重大影响

换言之:

仅在循环中使用中断是否有缺点 在循环后使用return而不是在第一个循环中使用return 地点


我能想到的主要区别是在函数内部使用时

function x() {
    var i = 1;
    while (i++) {
        console.log(i);
        if (i == 10) break;
    }
    console.log('outside');
};
x();

break
将退出循环,但
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');
//许可证:公共域
var mode=process.argv[2]=“中断”?假:真;
var迭代次数=process.argv[3]?process.argv[1]:1e9;
var testerations=process.argv[4]?process.argv[2]:1e4;
var数;
var范围=1e9;
函数testA(){
对于(变量i=0;i数字+数字){
数字=数字*2;
返回号码;
}
如果(数字){
number=Math.pow(2,Math.ceil(Math.random()*16));
返回号码;
}
如果(1==true | | 1==true){
number=number-number*number+Math.pow(number,Math.PI);
返回号码;
}
}
}
函数testB(){
对于(变量i=0;i数字+数字){
数字=数字*2;
打破
}
如果(数字){
number=Math.pow(2,Math.ceil(Math.random()*16));
打破
}
如果(1==true | | 1==true){
number=number-number*number+Math.pow(number,Math.PI);
打破
}
}
返回号码;
}
log('benchmarking'+(模式?'return':'break');
控制台时间(“基准”);
如果(模式){
对于(var i=0;i
执行后,我得到了这些结果(5个样本):

  • 基准测试中断:
    22262ms
    基准测试回报:
    21947ms

  • 基准测试中断:
    22549ms
    基准测试返回:
    22180ms

  • 基准测试中断:
    22443ms
    基准测试回报:
    22143ms

  • 基准测试中断:
    22304ms
    基准测试回报:
    22109ms

  • 基准测试中断:
    22293ms
    基准测试回报:
    22003ms

  • 总计:中断:
    111851ms
    ,返回:
    110382ms
    ,差异:
    1469ms
    1.3%


    如果此基准代码与您的类似,我可以放心地说,这两种变体之间没有显著的性能差异。

    这不是一个真正的性能问题,但是如果你使用
    break
    而不是
    return
    ,你可以在
    while
    循环后粘贴
    return
    ,并完全删除
    else
    ,使代码块缩短一行。@JamesDonnelly-这是对更糟糕问题的“回答”(我知道,评论)。如当前所述,while的持续时间为(!x&!y&z),删除
    else
    使其持续时间为(!x&!y)。但是,无论如何,这不是一个好问题。代码只是一个例子,我想问的是:在循环中使用中断,只是在循环之后使用返回,而不是在一开始就使用返回,这是一个坏问题。如果在循环完成后要运行一些代码呢?此外,你没有回路。如果->返回其他->返回。。。while循环有什么意义呢?我猜它在性能方面可能很少。和以往一样,您需要在您的环境中自己测量它以确定答案。另一方面是可读性,但更多的是基于观点。就个人而言,我更喜欢多重回报。我知道中断和回报的区别。我问的纯粹是性能方面的问题,但如果性能是关键的,它们之间没有区别(只有编码风格),即使是1.3%也可以。谢谢如果您计划基于该基准更改代码,我建议您再运行几次,因为1.3%仍然可能是由于测试的随机性或其他原因。谢谢提醒:)。这是没有太多的改变反正几行,但我想知道的未来,它似乎是合乎逻辑的需要更长的时间。