【问题标题】:Using setImmediate() over setTimeout(func,0) in IE在 IE 中使用 setImmediate() 而不是 setTimeout(func,0)
【发布时间】:2014-08-02 00:55:48
【问题描述】:

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

我的问题是:

  1. setImmediate() 不具备 setTimeout(func,0) 在引入 4ms 钳制之前的所有缺点吗?
  2. 那么为什么有人应该使用 setImmediate() 而不是 setTimeout(func,0) 呢?

【问题讨论】:

  • 这个函数是否存在于window.requestAnimationFrame不存在的IE版本中?
  • 没有。两者都是在 IE 10 中引入的。

标签: javascript internet-explorer asynchronous settimeout


【解决方案1】:

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

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

因为 setTimeout 和 setInterval 是时间相关的,浏览器使用本机操作系统计时器 API 来最有效地实现这一点。 Timer API 有一个分辨率,它决定了它在请求时间运行函数的精确度。标准 Windows API 提供大约 15ms 的分辨率,这意味着每 15ms CPU 需要唤醒并检查是否有需要执行的计时器回调。还有高分辨率计时器 API,如果您使用它们,CPU 将更频繁地唤醒以检查是否需要任何回调,从而消耗更多 CPU 功率。

在 setTimeout(func, 0) 的情况下,浏览器将安排它使用定时器 API 运行,并且它将在下次操作系统定时器唤醒并检查回调时运行,如果使用标准定时器 API,则可能是从 0 到 15 毫秒,具体取决于上次迭代的时间。这都是不必要的,因为无论如何我们都不关心时间。我们应该独立于任何计时器运行它,因此使用 setImmediate API。当然,如果你一直调用 setImmediate,它会增加功耗,但是当你不使用它时不会,这与使用高分辨率计时器不同。

所以回答你的问题:

1) 可以这么说,我不认为计时器一定会被限制在 4 毫秒。他们从来没有超过 4ms 的分辨率。是的,它大量使用 setImmediate 会增加功耗。如上所述,我认为省电来自于您在空闲时。

2) 出于上述原因!!

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-07-29
  • 2016-10-23
  • 2016-05-30
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
  • 2016-10-30
  • 2010-10-22
相关资源
最近更新 更多