Firefox的性能滞后于大整数

时间:2013-03-18 01:29:31

标签: javascript firefox

背景故事

我正在寻找2的大功率。我的方法是将大数字拆分成一个较小值的数组,并将它们相乘以得到下一个值。我为较小的块选择的大小是1e15的最大大小。然后我决定看看如果我使用新的数组缓冲区并且必须将最大大小减小到1e9,性能如何变化。发生了一些奇怪的事情我得到的性能提升不是使用数组缓冲区,而是使用较小的整数。这没有意义,因为数字越大,函数在数组中循环的次数就越少。

代码

var i=3
function run(){
  loop(50000,Math.pow(10,i),i++);
  if(i<16)setTimeout(run,100)
}
run();

function loop(pin,lim,id){
  var pow=110503;
  pow=pin||pow;
  var l=pow-1,val=[2];
  var t1,t2;
  //console.time(id);
  t1=new Date();
  while(l--){
    val=multiply(val,lim);
  }
  //console.timeEnd(id);
  t2=new Date();
  console.log(id,' ',t2-t1);
}

function multiply(a,lim){
  var l=a.length,val=0,carry=0;
  while(l--){
    val=a[l]*2+carry;
    carry=0;
    if(val>lim-1){
      var b=val%lim;
      carry=(val-b)/lim;
      val=b;
    }
    a[l]=val;
  }
  if(carry>0){a.unshift(carry)}
  return a;
} 

结果

IE10

 3 5539 
 4 4213 
 5 3329 
 6 2720 
 7 2341 
 8 2153 
 9 1948 
 10 1699 
 11 1508 
 12 1401 
 13 1309 
 14 1208 
 15 1133 

3 5962
4 4385
5 3851
6 3242
7 2533
8 2207
9 1940
10 1794
11 1542
12 1604
13 1560
14 1414
15 1331

火狐

3 3651 
4 2732 
5 2279 
6 1853 
7 1615 
8 1408 
9 1256 
10 2375 
11 2034 
12 1874 
13 1723 
14 1600 
15 1504

问题

正如您所看到的,Firefox的表现优于IE10和Chrome,而且数字长度为9位,然后会突然跳跃。那么,为什么这样做呢?我想这可能与在32位字节之间存储的数字之间切换有关。我认为32字节数字更有效率;所以对于较小的数字,他们使用它们,然后如果需要,则切换到更大的整数类型。但如果这是真的,为什么它永远不会赶上Chrome和IE的性能,并且切换会导致性能损失呢?

1 个答案:

答案 0 :(得分:0)

SpiderMonkey(Firefox)和V8(Chrome)都可以使用32位整数,当数字不再适合32位int时,切换到双精度(不是更大的整数)。但请注意,“can”是启发式确定的,因为由于必须来回转换,混合双倍和整数会有成本,因此V8可能不会决定专注于此处的内容。

编辑:删除了有关需要源的部分,因为它在原始帖子中就可以了!