为什么算法性能不同

时间:2015-02-28 11:38:47

标签: javascript algorithm

我必须实施'范围'函数在javascript中像python中的那个。

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;
}

似乎第二个效果更好。总是,在许多场景中有一个更好的解决问题的方法,但为什么会这样呢?是什么让第一个范围功能变慢,或者使第二个功能更快?

2 个答案:

答案 0 :(得分:2)

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

函数调用并不会导致高性能成本,这只是微优化。对于这种情况,两组实现应该大致相同。

答案 1 :(得分:2)

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

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

请注意,实现结果也有所不同。第一个函数将始终返回一个包含至少一个项的数组,即使y小于x,而第二个函数在这种情况下返回一个空数组。第一个函数还包括<= y的所有值,而第二个函数包含< y的所有值。如果它没有返回正确的结果,哪个实现更快就没关系。

编辑:

删除函数调用时,函数之间的性能差异非常小:

http://jsperf.com/range-for-vs-while

我使用while添加了一个实现,它与for循环的代码完全等效:

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

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

由于某些原因,Chrome运行此实现的速度稍快,在其他浏览器中,性能相同。