0

裏話

私は 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 のパフォーマンスに追いつかず、切り替えによってパフォーマンスが大幅に低下するのでしょうか?

4

1 に答える 1

0

SpiderMonkey(Firefox)とV8(Chrome)はどちらも、可能な場合は32ビット整数を使用し、数値が32ビット整数に収まらなくなった場合はdouble(より大きい整数ではない)に切り替えます。ただし、「can」はヒューリスティックに決定されることに注意してください。これは、前後に変換する必要があるためにdoubleとintを混合するコストがかかるため、V8がここでintに特化することを決定していない可能性があります。

編集:ソースが必要な部分を削除しました。元の投稿にすべて含まれているためです。

于 2013-03-18T13:16:15.067 に答える