为什么算法性能不同

Why algorithm performance differs

本文关键字:性能 算法 为什么      更新时间:2024-06-27

我必须用javascript实现一个"range"函数,就像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;
}

似乎第二个效果更好。在许多情况下,总是有更好的方法来解决问题,但为什么会这样呢?是什么使第一个量程功能变慢,还是什么使第二个量程功能更快?

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

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

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

尽管函数调用并不昂贵,但当您在这样的循环中进行函数调用时,每次迭代中几乎没有工作量,这将大大增加正在完成的工作量。

请注意,实现的结果也有所不同。即使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运行此实现的速度稍快,在其他浏览器中的性能相同。