Javascript 算法性能差异的原因
我必须用javascript实现一个类似python的“range”函数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 +=
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;
}