为什么算法性能不同
Why algorithm performance differs
我必须用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运行此实现的速度稍快,在其他浏览器中的性能相同。
相关文章:
- 函数参数中的数据与指定变量之间的任何性能差异
- 提高JQuery的性能
- 循环比赛位置算法
- javascript扫雷器floodfill算法不能正常工作
- 使用正则表达式评估电子邮件地址时出现性能问题
- React:按键的性能提升
- 在Three.js中导出网格会提高性能吗
- 在javascript中搜索项目列表的性能
- 为什么在许多浏览器中drawImage()的性能略好于createPattern()
- JavaScript数组优化以提高性能
- React+Redux性能优化与组件ShouldUpdate
- Node JS中的排名系统算法
- 在循环中附加事件处理程序时出现浏览器性能问题
- JavaScript-===vs===运算符性能
- 查找仅适用于原始图像的图像放大算法的名称
- 在数组的 2/3 上调用自身的排序算法
- 为什么算法性能不同
- JavaScript 算法性能 - 计算可被 k 整除的范围内的数字数
- JavaScript 非递归排列算法性能
- 性能方面,算法复杂性方面,下面两个JS函数中哪一个用于将字符串的第一个字母大写更好,为什么?