Javascript:使用setInterval进行后台任务的理想块大小?
问题描述:
考虑通过setTimeout
/setInterval
定期执行后台任务的应用程序。一个函数调用应该完成多少工作?Javascript:使用setInterval进行后台任务的理想块大小?
例子:
myTask = function() {
for (var i=0; i<chunkSize; i++) { ...work... }
}
setInterval(myTask, period);
如果增加chunkSize
(做每个呼叫更多的迭代),当然它会运行的时间更长。这意味着,period
也将不得不增加,你可以不经常调用该函数。但我发现,尽管如此,块越大,工作就越多。这可能是由于setTimeout
/setInterval
权衡是开销:较大的块大小使应用程序的反应性较低。这不仅涉及用户交互,还涉及其他间隔。因为只要函数正在运行迭代,就不会触发其他时间间隔。因此,大块大小会导致其他间隔不够精确,或者(在最坏的情况下)会在某些浏览器中完全禁用它们,以免它们再被调用。
如果你想
- 最大化的工作得到完成
- 尽量减少对其他区间不良影响,使他们准确
什么是实现这一目标的最佳途径是多少?你如何确定一个好的块大小?还是应该监视循环中的执行时间并在一定时间后中止?或者是其他东西?
(顺便说一句,这是关于普通的旧的JavaScript,HTML5不WebWorkers)
答
如果可以的话,你应该使用setTimeout
而不是setInterval
。 setInterval
将在period
之后调用该功能,以确定前一间隔的功能是否完整。通过setTimeout
,您可以确保该功能在再次调用之前完成。
(function myTask() {
for (var i=0; i<chunkSize; i++) { ...work... }
setTimeout(myTask, period);
})();
为什么你不使用工作线程呢?我个人会使用reverse-AJAX,因为回调是首先异步执行的,但我喜欢使事情复杂化:D – Art
为什么不使用工作线程? 1),因为它们不受旧版浏览器的支持。 2)因为我的作业共享数据对象。这对于工作者线程来说是不可能的,除非你继续序列化和反序列化它们,这会造成主要开销和同步问题。 – travelboy