簡體   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