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