javascript - JS引擎处理数据,为什么不符合预期值

标签 javascript

我正在测试 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 次迭代(未优化)之后,在新的假设下重新优化代码 sumintdouble , 这也使得 ++sum比它只是一个 int 时稍微慢一点.

关于javascript - JS引擎处理数据,为什么不符合预期值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54167296/

相关文章:

javascript - 使用html注释实现lazyload

javascript - 改进 THREE.js 中旋转三 Angular 形/面的 UV 坐标生成

javascript - Jquery.change 在页面加载时触发

javascript - Jquery - 使用 grep 搜索表的所有列?

javascript - 计算百分比网格布局单元格宽度

javascript - 控制台无法输出该目录下的文件?

javascript - react 级联渲染

javascript - 上传时如何设置图像不透明度的不透明度?

javascript - 如何定义 Angular 指令必须是 Angular 中特定指令的子指令?

javascript - twbsPagination totalPage 值总是在变化?