Javascript 算法性能差异的原因

Javascript 算法性能差异的原因,javascript,algorithm,Javascript,Algorithm,我必须用javascript实现一个类似python的“range”函数 function range (x, y, i){ i = i || 1; j = [x]; while (y > (x+i)) { j.push(x += i); } return j; } function range2 (x, y, i){ i = i|| 1; j = []; for (x ; x < y; x +=

我必须用javascript实现一个类似python的“range”函数

function range (x, y, i){
    i = i || 1;

    j = [x];
    while (y > (x+i)) {
        j.push(x += i);
    }
    return j;
}

function range2 (x, y, i){
    i = i|| 1;

    j = [];
    for (x ; x < y; x += i) {
        j.push(x);
    };
    return j;
}
功能范围(x,y,i){
i=i | | 1;
j=[x];
而(y>(x+i)){
j、 推力(x+=i);
}
返回j;
}
功能范围2(x,y,i){
i=i | | 1;
j=[];
对于(x;x

看起来第二个更好用。在很多情况下,总是有更好的方法解决问题,但为什么会这样呢?是什么使第一个范围函数变慢了,还是什么使第二个范围函数变快了?

因为您正在第一个函数中调用函数。这是额外的开销


函数调用实际上不会带来高性能成本,这只是一种微观优化。在这种情况下,这两组实现的时间应该大致相同。

因为您正在第一个函数中调用一个函数。这是额外的开销

函数调用实际上不会带来高性能成本,这只是一种微观优化。在这种情况下,这两组实现的时间应该大致相同。

函数之间的主要区别(性能方面)是第一组函数为循环中的每个迭代调用函数

虽然函数调用不是很昂贵,但当您在这样的循环中执行时,每次迭代中几乎没有工作,这将大大增加所做的工作

请注意,实现的结果也存在差异。第一个函数将始终返回至少包含一个项的数组,即使
y
小于
x
,而第二个函数在这种情况下返回空数组。另外,第一个函数包含所有
值。函数之间的主要区别(性能方面)是第一个函数为循环中的每个迭代调用函数

虽然函数调用不是很昂贵,但当您在这样的循环中执行时,每次迭代中几乎没有工作,这将大大增加所做的工作



请注意,实现的结果也存在差异。第一个函数将始终返回至少包含一个项的数组,即使
y
小于
x
,而第二个函数在这种情况下返回空数组。另外,第一个函数包含所有
的值。第二个函数似乎工作得更好
-如何?它们的复杂度完全相同。是因为for循环比while循环好还是反之亦然?
第二个函数似乎工作得更好
-如何?它们的复杂度完全相同。是因为for循环更好吗而不是while循环,反之亦然?好的,删除了函数,但两种算法的性能仍有差异Sok,删除了函数,但两种算法的性能仍有差异Supdate,无函数调用now@SnorkS:这使得性能差异最小。我在答案中添加了一个性能测试。这是否意味着while循环更好?至少对于chrome?而且range和range3的功能差不多,为什么range3更快?@SnorkS:不,这只意味着这个精确的实现在chrome中工作得稍微好一点。代码中的任何微小更改都可能扭转这种情况。正如您在
range
range3
之间的细微差别(条件中的
x+i
和方法调用中使用的
x+=i
)中所看到的,几乎不可能准确预测代码将如何执行。所有这些都是微观优化,尤其是在Javascript中,这是徒劳的。更新后,无需函数调用now@SnorkS:这使得性能差异最小。我在答案中添加了一个性能测试。这是否意味着while循环更好?至少对于chrome?而且range和range3的功能差不多,为什么range3更快?@SnorkS:不,这只意味着这个精确的实现在chrome中工作得稍微好一点。代码中的任何微小更改都可能扭转这种情况。正如您在
range
range3
之间的细微差别(条件中的
x+i
和方法调用中使用的
x+=i
)中所看到的,几乎不可能准确预测代码将如何执行。所有这些都是微观优化,尤其是在Javascript中,这是徒劳的。
function range3 (x, y, i){
    i = i|| 1;
    
    j = [];
    x;
    while (x < y) {
        j.push(x);
        x += i;
    };
    return j;
}