如何监控for循环?

时间:2016-08-10 09:20:13

标签: 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);

但它没有输出任何东西。

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

1 个答案:

答案 0 :(得分:6)

由于Javascript的单线程特性,无论执行多长时间,都无法在setInterval()循环结束之前调用for回调。< / p>

我建议反过来做:每N次迭代记录经过的时间。

&#13;
&#13;
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);
&#13;
&#13;
&#13;

或者:

&#13;
&#13;
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);
&#13;
&#13;
&#13;

如果您确实想实时登录,则必须在每批N次迭代后对浏览器进行控制。性能方面,这可能会产生重大影响。

&#13;
&#13;
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);
&#13;
&#13;
&#13;

编辑:第三种方法已大幅更新。以前的版本是错误的。