setInterval CPU是否密集?


70

我在某处读到setInterval占用大量CPU的信息。我创建了一个使用setInterval的脚本,并监视了CPU使用率,但没有发现任何变化。我想知道是否有什么我想念的。

代码要做的是每100毫秒检查一次URL中的哈希值(#后面的内容)是否更改,如果更改了,请使用AJAX加载页面。如果未更改,则什么都不会发生。会不会有CPU问题。


2
确实取决于调用的函数和您指定的时间量。显然,每100毫秒(即1000行)调用一个函数会占用大量CPU。
沙兹(Shaz)

在Chrome上,顺便说一下,如果选项卡处于非活动状态,则只会每秒调用一次间隔功能。因此,如果您的网站/应用程序未处于活动状态,则肯定是CPU友好的。
pimvdb

是否需要轮询更改?您不仅可以为所有锚点添加点击处理程序吗?
戴文2011年

感谢大家的答复,他们非常有帮助。
Ryuku 2011年

@davin:是的,我这样做,但是问题是用户单击后退按钮还是手动更改URL。
Ryuku 2011年

Answers:


69

我认为不会setInterval从本质上引起您严重的性能问题。我怀疑这种声誉可能来自更早的时代,当时CPU的功能不那么强大。

但是,有一些方法可以提高性能,并且这样做可能是明智的:

  1. 将函数传递给setInterval,而不是字符串。
  2. 设置尽可能少的间隔。
  3. 使间隔持续时间尽可能长。
  4. 每次运行的代码都尽可能短而简单。

不要过早地进行优化-在没有问题的情况下,不要让自己生活困难。

但是,在特定情况下可以做的一件事是在支持onhashchange事件的浏览器中使用事件,而不是超时。


1
感谢您的建议。对这个主题的所有回应都非常有帮助,非常感谢。我选择此答案是因为onhashchange非常有用。
2011年

1
哇,非常彻底和简洁的答案!感谢您的提示!
是Barry 2012年

1
我会单独投票给“不要过早优化”。简洁明了,非常有帮助。
ghukill

17

我宁愿说完全相反。正确使用setTimeout和使用setInterval,可以大大减少浏览器的CPU使用率。例如,使用setTimeout而不是使用fororwhile循环不仅会降低CPU使用强度,而且还可以确保浏览器有机会更频繁地更新UI队列。因此,长时间运行的进程不会冻结并锁定用户体验。

但总的来说,setInterval在您的网站上大量使用可能会减慢速度。20个同时运行的间隔或多或少的繁重工作都会影响演出。再说一遍..您真的可以弄乱我认为不是问题的任何部分setInterval

..顺便说一句,您不需要像这样检查哈希。有一些事件:

onhashchange

当哈希值发生变化时将触发。

window.addEventListener('hashchange', function(e) {
    console.log('hash changed, yay!');
}, false);

10

不,setIntervalCPU本身并不占用大量资源。如果您有很多间隔以非常短的周期运行(或者以非常长的间隔运行非常复杂的操作),则很容易占用CPU资源,具体取决于间隔的执行情况和执行的频率。

我本来希望每隔100毫秒检查一次URL不会出现任何问题,尽管我个人会将该间隔增加到250毫秒,只是因为我不希望两者之间的差异在典型情况下会很明显用户,因为我通常会尝试使用我认为可以避免的最长超时间隔,特别是对于大多数情况下预期会导致无操作的情况。


4

在“ CPU密集型”术语下有一些营销活动。真正的意思是“比某些替代方案更多的CPU消耗”。它不像“像游戏或压缩算法那样使用大量CPU能力”中的“ CPU密集型”。

说明:

一旦浏览器产生了控制权,它就依靠来自底层操作系统和硬件的中断来接收控制权并发出JavaScript回调。这些中断之间的持续时间较长,使硬件可以进入低功耗状态,从而大大降低了功耗。默认情况下,Microsoft Windows操作系统和基于Intel的处理器对这些中断(每秒64个中断)使用15.6ms分辨率。这使基于Intel的处理器可以进入最低功耗状态。因此,使用HTML4浏览器(包括Internet Explorer和Mozilla Firefox的早期版本)时,使用setTimeout(0)时,Web开发人员传统上只能实现每秒64个回调。

在过去的两年中,浏览器已尝试通过更改对功耗敏感的Windows系统设置并防止硬件进入低功耗状态,来提高JavaScript开发人员通过setTimeout和setInterval API可以接收的每秒回调数。HTML5规范已经极端推荐每秒250个回调。这种高频率会导致功耗增加40%,从而影响电池寿命,运营费用和环境。此外,这种方法没有解决提高CPU效率和调度的核心性能问题。

http://ie.microsoft.com/testdrive/Performance/setImmediateSorting/Default.html


4

就您而言,不会有任何问题。但是,如果您在画布上进行一些大型动画制作或使用webgl进行操作,则会出现一些CPU问题,因此可以使用requestAnimationFrame。

请参阅此链接关于requestAnimationFrame


2

函数时间>间隔时间不好,您不知道cpu何时打or或变慢,它会堆积在正在进行的功能之上,直到pc死机为止。使用settimeout或更好的方法,使用settimeout中的回调进行process.nextick。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.