javascript - 如何监控for循环?

标签 javascript performance for-loop

我想每 X 毫秒监控一次 for 循环的内容:

这是一个示例,我希望每 0.1 秒看到一次进度百分比:

for (i = 0, max = 9007199254740992, timer = setInterval(function() {console.log(100*i/max);}, 100); i < max; i++) {
  // something
}
clearInterval(timer);

但它没有输出任何内容。

我不想在循环中添加测试以避免使用无用的计算时间。

最佳答案

由于 Javascript 的单线程特性,您的 setInterval() 回调不可能在 for 循环结束之前调用,无论多长时间需要执行。

我建议以相反的方式进行:每 N 次迭代记录耗时。

var res = [],
    ts = performance.now();

for(var i = 0, max = 1E6; i < max; i++) {
  if(!(i % 10000)) {
    res.push(performance.now() - ts);
  }
  // do something
}

console.log(res);

或者:

var res = [],
    ts = performance.now();

for(var i = 0, iMax = 1E6; i < iMax; i += 10000) {
  for(var j = i, jMax = Math.min(i + 10000, iMax); j < jMax; j++) {
    // do something
  }
  res.push(performance.now() - ts);
}

console.log(res);

如果您确实想要实时登录,则必须在每批 N 次迭代后将控制权交给浏览器。不过,就性能而言,这可能会产生重大影响。

var res = [],
    ts = performance.now();

function processBatch(i, iMax, sz) {
  for(var j = i, jMax = Math.min(i + sz, iMax); j < jMax; j++) {
    // do something
  }
  console.log((j * 100 / iMax) + '%', (performance.now() - ts).toFixed(2) + 'ms');

  if(j < iMax) {
    setTimeout(function() { processBatch(j, iMax, sz); }, 0);
  }
}

processBatch(0, 1E6, 10000);

编辑:第三种方法进行了重大更新。之前的版本有错误。

关于javascript - 如何监控for循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38869172/

相关文章:

javascript - 如何完全改变div onclick的内容?

c# - 在哪里附加碰撞检测脚本?

python - 有效地模糊搜索大量数据?

c++ - for 循环指令的工作方式与 C++ 中的理论不同

javascript - 在 React 中使用静态 HTML

javascript - React Native 中标题样式问题

javascript - jade/pug 是否可以在 include 语句中使用变量?

sql - ORM 性能成本

Javascript:如何循环和更改键名?

Javascript 的 getElementById 在我的循环中不起作用