我正在寻找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的性能,并且切换会导致性能损失呢?
答案 0 :(得分:0)
SpiderMonkey(Firefox)和V8(Chrome)都可以使用32位整数,当数字不再适合32位int时,切换到双精度(不是更大的整数)。但请注意,“can”是启发式确定的,因为由于必须来回转换,混合双倍和整数会有成本,因此V8可能不会决定专注于此处的内容。
编辑:删除了有关需要源的部分,因为它在原始帖子中就可以了!