繁体   English   中英

为什么大数字递增运算符(++)性能不佳?

[英]Why do incrementing operators (++) with large numbers have poor performance?

我注意到,当递增计数器时,当计数器的值很大时,它会明显变慢。 我在Chrome,Firefox和IE11中尝试过它,所有这些都表现得很差。

请参阅此处的 jsperf test(下面的代码):

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;
}

为什么会这样?

现代JavaScript运行时和编译器执行称为SMI (小整数)的优化。

JavaScript中的所有数字都是双精度浮点数,执行计算的速度相对较慢。 但是,在很多情况下(例如大多数for循环),我们正在使用整数。

因此 - 在可能的情况下优化数字以执行有效计算非常有用。 当引擎可以证明一个数字是一个小整数时 - 它会乐意将它视为这样,并执行所有计算,就像数字是一个整数一样。

增加32位整数是单处理器操作并且非常便宜。 所以你做得更好。

你使用的这个“大”数字非常大,我敢打赌它是处理32位数量和超过32位数量之间的差异。 尝试使用1,500,000,00(子32位签名),3,000,000,000(子32位无符号)和5,000,000,000(超过32位)的基数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM