为什么这个函数 运行 长数字比短数字更快?
Why does this function run faster with long numbers than short numbers?
我写了一个 JS perf 来表明通过幅度缩减来解析数字中的数字比通过字符串评估(对于排序任务)更快。不过我发现,对于更长的数字(不是每个数字,而是总的),幅度缩减算法执行操作的速度更快,即使它应该为那些更长的数字循环更多次。它发生在 Chrome、Safari 和 Firefox on OS X(没有测试其他 OSs)。
知道这里发生了什么吗?
这是性能:http://jsperf.com/get-digits-from-integer
Edit 这是一个 perf,它显示了不同数字 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();
}
在检查一个函数的性能之前,您应该检查它实际上 returns 正确的结果。
您正在使用 >> 0
将数字截断为整数。按位运算适用于 32 位数字,因此该函数仅适用于最大 21474836479
.
的数字
如果你使用 num = Math.floor((num / 10));
它会处理更大的数字,但是 JavaScript 中数字的精度限制在 15-17 位,所以 91827766102983847569298376298387839
和91882759110292883726299387440027766102983847569298376298387839
是正确的。
我写了一个 JS perf 来表明通过幅度缩减来解析数字中的数字比通过字符串评估(对于排序任务)更快。不过我发现,对于更长的数字(不是每个数字,而是总的),幅度缩减算法执行操作的速度更快,即使它应该为那些更长的数字循环更多次。它发生在 Chrome、Safari 和 Firefox on OS X(没有测试其他 OSs)。
知道这里发生了什么吗?
这是性能:http://jsperf.com/get-digits-from-integer
Edit 这是一个 perf,它显示了不同数字 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();
}
在检查一个函数的性能之前,您应该检查它实际上 returns 正确的结果。
您正在使用 >> 0
将数字截断为整数。按位运算适用于 32 位数字,因此该函数仅适用于最大 21474836479
.
如果你使用 num = Math.floor((num / 10));
它会处理更大的数字,但是 JavaScript 中数字的精度限制在 15-17 位,所以 91827766102983847569298376298387839
和91882759110292883726299387440027766102983847569298376298387839
是正确的。