Javascript: setInterval用于后台任务的理想块大小



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

的例子:

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

如果您增加chunkSize(并且每次调用执行更多的迭代),当然它将运行更长时间。这意味着,period也必须增加,您可以更少地调用该函数。但我发现,不管怎样,分块越大,完成的工作就越多。这可能是由于setTimeout/setInterval

的开销。

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

如果你想

  • 最大化完成的工作量
  • 尽量减少其他间隔的不良影响,并保持它们的准确性

实现这一目标的最佳方法是什么?如何确定一个好的块大小?或者我应该监视循环中的执行时间,并在一段时间后中止?还是别的什么?

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

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

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

最新更新