setInterval CPU是否密集?

时间:2011-07-11 12:33:38

标签: javascript ajax cpu setinterval

我在某处读到了setInterval是CPU密集型的。我创建了一个使用setInterval的脚本并监视CPU使用情况但没有注意到更改。我想知道是否有遗漏的东西。

代码的作用是每隔100毫秒检查URL中的哈希值(#之后的内容)是否有变化,如果已更改,则使用AJAX加载页面。如果它没有改变,没有任何反应。会不会有任何CPU问题。

6 个答案:

答案 0 :(得分:57)

我认为setInterval本身并不会导致严重的性能问题。我怀疑声誉可能来自早期的时代,当时CPU的功能不那么强大。

但是,有一些方法可以改善性能,而且这样做可能是明智之举:

  1. 将函数传递给setInterval,而不是字符串。
  2. 设置尽可能少的间隔。
  3. 尽可能延长间隔时间。
  4. 让代码每次运行尽可能简短。
  5. 不要过早优化 - 在没有问题时不要让自己生活困难。

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

答案 1 :(得分:14)

我宁愿说这恰恰相反。正确使用setTimeoutsetInterval可以大大减少浏览器的CPU使用率。例如,使用setTimeout而不是使用forwhile循环不仅会降低CPU使用强度,还会保证浏览器有机会更新UI队列更经常的。因此,长时间运行的进程不会冻结并锁定用户体验。

但总的来说,在您的网站上使用setInterval非常喜欢可能会减慢速度。 20个同时运行的间隔或多或少的繁重工作将影响节目。然后再说..你真的可以弄乱任何部分,我猜这不是setInterval的问题。

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

onhashchange
当散列发生变化时,

将触发。

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

答案 2 :(得分:9)

不,setInterval本身不是CPU密集型的。如果你有很多间隔在非常短的周期内运行(或者在一个中等长的时间间隔内运行一个非常复杂的操作),那么 很容易变成CPU密集型,具体取决于你的间隔在做什么和他们这样做的频率如何。

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

答案 3 :(得分:4)

在“CPU密集型”术语下有一些营销活动。它的真正含义是“比一些替代品更加CPU密集”。它不是“CPU密集型”,因为“像游戏或压缩算法那样使用大量的CPU能力”。

说明:

  

一旦浏览器产生了控制权,它就依赖于来自的中断   底层操作系统和硬件接收控制和   发出JavaScript回调。这些之间的持续时间更长   中断允许硬件进入低功率状态   显着降低功耗。   默认情况下,Microsoft Windows操作系统和基于Intel的操作系统   处理器对这些中断使用15.6ms分辨率(64个中断   每秒)。这使得基于Intel的处理器能够进入最低端   权力状态。出于这个原因,Web开发人员传统上只有   使用setTimeout(0)时能够达到每秒64次回调   使用HTML4浏览器时,包括早期版本的Internet   Explorer和Mozilla Firefox。

     

在过去两年中,浏览器一直试图增加数量   JavaScript开发人员每秒可以接收的回调数   setTimeout和setInterval API是通过改变功率意识来实现的   Windows系统设置并防止硬件进入低位   权力状态。 HTML5规范已经走到了极致   推荐每秒250次回调。可能导致这种高频率   功耗增加40%,影响电池寿命,   营业费用和环境。另外,这种方法   没有解决改善CPU的核心性能问题   效率和日程安排。

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

答案 4 :(得分:3)

在您的情况下,不会有任何问题。但是如果你在画布上做一些巨大的动画或使用webgl,那么会出现一些CPU问题,所以你可以使用requestAnimationFrame。

请参阅此链接About requestAnimationFrame

答案 5 :(得分:1)

功能时间>间隔时间很糟糕,你不能知道cpu打嗝或慢速时它​​会堆积在正在进行的功能之上,直到pc冻结。使用settimeout甚至更好的方法,使用settimeout中的回调来处理process.nextick。