Javascript:使用setInterval进行后台任务的理想块大小?

时间:2011-10-12 03:01:27

标签: javascript settimeout setinterval

考虑通过setTimeout / setInterval定期执行后台任务的应用程序。一个函数调用应该做的理想工作量是多少?

示例:

myTask = function() {
  for (var i=0; i<chunkSize; i++) { ...work... }
}

setInterval(myTask, period);

如果增加chunkSize(并且每次调用执行更多迭代),当然它会运行更长时间。这意味着,period也必须增加,你可以减少调用该函数的频率。但我发现,块越大,工作就越多。这可能是由setTimeout / setInterval

的开销造成的

权衡是:更大的块大小使应用程序的反应性降低。这不仅涉及用户交互,还涉及其他间隔。因为只要函数运行其迭代,就不会触发其他间隔。因此,大块大小使得其他间隔不准确,或者(在最坏的情况下)在某些浏览器中完全禁用它们,因此它们不再被调用。

如果你想

  • 最大限度地完成工作量
  • 最大限度地减少对其他间隔的不良影响并保持准确

实现这一目标的最佳方法是什么?你如何确定一个好的chunkSize?或者我应该监控循环中的执行时间并在一段时间后中止?或其他什么?

(顺便说一句,这是关于普通的旧JavaScript,而不是HTML5 WebWorkers)

1 个答案:

答案 0 :(得分:2)

如果可以,您应该使用setTimeout代替setIntervalsetInterval将在period之后调用该函数,无论上一个间隔中的函数是否完成。使用setTimeout,您可以在再次调用之前确保该函数已完成。

(function myTask() {
  for (var i=0; i<chunkSize; i++) { ...work... }
  setTimeout( myTask, period );
})();