我正在测试 JS 引擎处理不同级别数据的能力。 但是这个结果让我很吃惊。
const step = [10,100,1000,10000,100000,1000000,10000000,100000000,1000000000];
let sum = 0;
step.forEach((item) => {
let n = item.toString().split('').length -1;
console.time(`10^${n}`);
while (item){
++sum;
--item;
}
console.timeEnd(`10^${n}`);
})
10^1 比 10^3 慢,或 10^5 比 10^6 慢,或两者都慢。
测试的runtime包括:chrome71,node 10.13.0,firefox64(还不错)
我不知道这是不是V8的行为。
我遵循了 CertainPerformance 的建议使用 performance.now()
// nodeJs
//const { performance } = require('perf_hooks');
const step = [10,100,1000,10000,100000,1000000,10000000,100000000,1000000000];
let sum = 0;
step.forEach((item) => {
let n = item.toString().split('').length -1;
let t0 = performance.now();
while (item){
++sum;
--item;
}
let t1 = performance.now();
console.log(`10^${n}:`,t1-t0);
})
它会出现不止几次。
最佳答案
您应该多次运行该代码,因为代码第一次运行时从未优化过,并且在您运行此代码时,JS 引擎开始优化部分代码/函数。当您再次按下“运行代码片段”时,它在技术上是一个新代码,优化器需要重新开始。
您会发现它在第一次运行后更加一致:
而且我不会过多解读 <0.1 毫秒范围内的波动以及由此产生的前几项之间的顺序差异。
const step = [10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000];
let sum = 0;
const test = (item) => {
let n = item.toString().split('').length - 1;
console.time(`10^${n}`);
while (item) {
++sum;
--item;
}
console.timeEnd(`10^${n}`);
};
const runTest = (times) => {
if (times > 0) {
sum = 0;
step.forEach(test);
console.log("----");
setTimeout(runTest, 10, times - 1);
}
}
runTest(10);
.as-console-wrapper {
top: 0;
max-height: 100%!important
}
旁注:如果不重置 sum = 0
,您会看到,运行几次后,运行时间会上升。这是因为 sum
达到不再表示为 int
的值而是变成了 double
.这不仅使++sum
只是稍微贵一点,由于迭代次数加起来,但它也否定了优化器对 sum
类型的假设在你的代码中,这会导致代码的取消,并且在 100-150 次迭代(未优化)之后,在新的假设下重新优化代码 sum
是 int
或 double
, 这也使得 ++sum
比它只是一个 int
时稍微慢一点.
关于javascript - JS引擎处理数据,为什么不符合预期值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54167296/