在IE中使用setImmediate()而不是setTimeout(func,0)

时间:2014-08-02 00:55:48

标签: javascript internet-explorer asynchronous settimeout

根据IE docs引入setImmediate来解决核心性能问题,而不会对功耗产生负面影响。 IE如何实现这一目标? (特别是如果4ms钳位setTimeout的原因是因为'试图增加每秒回调次数导致高功耗)

我的问题是:

  1. 在引入4ms的钳位之前,setImmediate()是否具有setTimeout(func,0)的所有缺点?
  2. 为什么有人会使用setImmediate()而不是setTimeout(func,0)呢?

1 个答案:

答案 0 :(得分:1)

我不是专家,但这是我对此的看法:

setTimeout(func,0)基本上是'当这个函数返回并且UI线程下一个空闲时运行此函数'的hack。这明显不同于其预期用途'2秒后运行此代码'。在前者中,我们并不关心函数何时运行 - 它可以在10ms,20ms运行,如果UI线程真的很忙,它可以在3秒后运行。

因为setTimeout和setInterval是时间相关的,所以浏览器使用本机OS计时器API来最有效地实现这一点。 Timer API具有分辨率,可确定在请求时运行函数的精确程度。标准的Windows API提供大约15ms的分辨率,这意味着CPU需要唤醒每15ms并检查是否存在需要执行的定时器回调。还有高分辨率计时器API,如果你使用它们,CPU会更频繁地唤醒,以检查是否需要任何回调,因此消耗更多的CPU能力。

对于setTimeout(func,0),浏览器将安排它使用计时器API运行,它将在下次OS计时器唤醒并检查回调时运行,如果使用标准计时器API,则可以从0到15ms,取决于最后一次迭代的时间。这一切都是不必要的,因为我们无论如何都不关心时间。我们应该独立于任何计时器运行它,因此setImmediate API。当然,如果你继续调用setImmediate,它会增加功耗,但是当你不使用它时,不会使用高分辨率的定时器。

所以回答你的问题:

1)我不认为定时器必须被钳制到4ms。他们的分辨率从未超过4毫秒。是的,它使用setImmediate会增加功耗。如上所述,我认为节省电力来自于您闲置时。

2)由于上述原因!!