在IE中使用setImmediate()替代setTimeout(func,0)的方法

3
根据IE文档,setImmediate的引入旨在解决核心性能问题,而不会对功耗产生负面影响。IE如何实现这一点?(特别是如果4ms的setTimeout夹紧是因为“尝试增加每秒回调次数”导致高功耗)
我的问题是:
  1. 在4ms夹紧引入之前,setImmediate()是否具有setTimeout(func,0)的所有缺点?
  2. 那么为什么有人要使用setImmediate()而不是setTimeout(func,0)呢?

这个函数在没有 window.requestAnimationFrameIE 版本中存在吗? - Paul S.
不是的。它们都是在IE 10中引入的。 - keheliya
1个回答

1

我不是专家,但这是我的想法:

setTimeout(func, 0)基本上是一个“hack”,用于“当此函数返回并且UI线程下次空闲时,运行此函数”。这与它的预期使用“在2秒后运行此代码”有明显区别。在前者中,我们并不真正关心函数何时运行 - 它可能在10毫秒、20毫秒后运行,如果UI线程非常繁忙,则可能在3秒后运行。

由于setTimeout和setInterval是时间相关的,浏览器使用本机操作系统定时器API来实现最高效的方式。定时器API具有分辨率,它确定它可以在请求时间精确地运行函数的能力。标准Windows API提供大约15毫秒的分辨率,这意味着每隔15毫秒,CPU需要唤醒并检查是否需要执行定时器回调。还有高分辨率定时器API,如果使用这些API,CPU将更频繁地唤醒以检查是否需要任何回调,从而消耗更多的CPU功率。

在setTimeout(func, 0)的情况下,浏览器将使用计时器API安排其运行,并在下一次操作系统定时器唤醒和检查回调时运行,如果使用标准计时器API,则可能从0到15ms,具体取决于上一次迭代的时间。这都是不必要的,因为我们无论如何都不关心时间。我们应该独立于任何计时器运行它,因此使用setImmediate API。当然,如果您不断调用setImmediate,它会增加功耗,但是当您不使用它时,与使用高分辨率计时器不同,它不会增加功耗。
所以回答你的问题:
1)我认为定时器不一定被限制为4ms。它们从来没有比4ms更高的分辨率。是的,频繁使用setImmediate会增加功耗。如上所述,我认为节省电力是在空闲时。
2)以上原因!

为了让答案更完整... Chrome 1.0beta使用了1ms的节流,后来将其增加到4ms,如此解释:http://www.belshe.com/2010/06/04/chrome-cranking-up-the-clock/ - keheliya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接