我注意到,当递增计数器时,当计数器的值为大数时,它会明显变慢。我在Chrome,Firefox和IE11中尝试过它,所有这些都表现得很差。
请参阅jsperf test here(以下代码):
var count1 = 0;
var count2 = new Date().getTime();
var count3 = 1e5;
var count4 = 1e9;
var count5 = 1e12;
var count6 = 1e15;
function getNum1() {
return ++count1;
}
function getNum2() {
return ++count2;
}
function getNum3() {
return ++count3;
}
function getNum4() {
return ++count4;
}
function getNum5() {
return ++count5;
}
function getNum6() {
return ++count6;
}
为什么会这样?
答案 0 :(得分:28)
现代JavaScript运行时和编译器执行名为SMI(小整数)的优化。
JavaScript中的所有数字都是双精度浮点数,执行计算的速度相对较慢。但是,在很多情况下(例如大多数for
循环),我们正在使用整数。
因此 - 在可能的情况下优化数字以执行有效计算非常有用。当引擎证明一个数字是一个小整数时 - 它会乐意将其视为一个整数,并执行所有计算,就像数字是一个整数一样。
增加32位整数是单处理器操作并且非常便宜。所以你做得更好。
答案 1 :(得分:0)
你正在使用的这个“大”数字真的很大,我敢打赌它是处理一个32位数量和一个多于32位数量之间的区别。尝试使用1,500,000,00(子32位签名),3,000,000,000(子32位无符号)和5,000,000,000(超过32位)的基础。