为什么这个函数在长数字而不是短数字时运行得更快?

时间:2015-05-08 19:55:30

标签: javascript google-chrome firefox safari

我写了一篇JS perf,表明通过数量减少解析数字中的数字比通过字符串评估(对于排序任务)更快。我发现虽然幅度减少算法对更长的数字(不是每个数字,但总共)执行操作更快,即使它应该为更长的数字循环更多次。它发生在OS X上的Chrome,Safari和Firefox中(尚未测试其他操作系统)。

任何想法在这里发生了什么?

这是perf:http://jsperf.com/get-digits-from-integer

编辑这是一个表示不同位数8,16,32,64和128的差异的性能。只有8位数字比预期慢,为16位,随着数字越来越长,性能会下降。 http://jsperf.com/get-digits-from-integer/3

这是有问题的功能:

function getDigitsByMagnitudeReduction(num){
  var digits = [];
  while (num > 0){
    digits.push(num % 10);
    num = (num / 10) >> 0;
  }
  return digits.reverse();
}

1 个答案:

答案 0 :(得分:6)

在检查函数的性能之前,应检查它是否实际返回了正确的结果。

您正在使用>> 0将数字截断为整数。按位运算使用32位数字,因此该函数仅适用于最大21474836479的数字。

如果你使用num = Math.floor((num / 10));它会使用更大的数字,但JavaScript中数字的精确度限制为15-17位,因此9182776610298384756929837629838783991882759110292883726299387440027766102983847569298376298387839的结果都不是将是正确的。