繁体   English   中英

如何监视循环?

[英]How to monitor a 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);

但是它不输出任何东西。

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

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

我建议采用另一种方法:每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); 

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM