【问题标题】:Is setInterval CPU intensive?setInterval CPU 密集吗?
【发布时间】:2016-11-26 00:10:16
【问题描述】:

我在某处读到 setInterval 是 CPU 密集型的。我创建了一个使用 setInterval 并监视 CPU 使用率的脚本,但没有注意到变化。我想知道我是否遗漏了什么。

代码的作用是每 100 毫秒检查一次 URL 中的哈希值(# 之后的内容)的变化,如果发生变化,则使用 AJAX 加载页面。如果它没有改变,什么都不会发生。会不会有任何 CPU 问题。

【问题讨论】:

  • 真的取决于被调用的函数和你指定的时间量。显然,每 100 毫秒调用一个 1000 行长的函数将是 CPU 密集型的。
  • 在 Chrome 上,如果选项卡处于非活动状态,则间隔函数仅每秒调用一次。因此,如果您的网站/应用程序未处于活动状态,它肯定是 CPU 友好的。
  • 是否需要轮询更改?您不能只为所有锚点添加点击处理程序吗?
  • 感谢大家的回复,他们很有帮助。
  • @davin: 是的,我这样做了,但问题是如果用户单击后退按钮或手动更改 URL。

标签: javascript ajax cpu setinterval


【解决方案1】:

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

不过,有一些方法可以提高性能,这样做可能是明智之举:

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

不要过早优化——不要在没有问题的时候让自己过不下去。

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

【讨论】:

  • 感谢您的建议。对此线程的所有回复都非常有帮助,我感谢大家。我选择这个答案是因为 onhashchange 非常有用。
  • 哇一个非常彻底和简洁的答案!感谢您的提示!
  • 我会单独投票支持“不要过早优化”。简洁明了,很有帮助。
【解决方案2】:

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

但总的来说,在您的网站上使用 setInterval 真的很像很多可能会减慢速度。 20 个或多或少繁重工作的同时运行间隔会影响演出。再说一遍..你真的可以把任何部分搞砸我猜这不是setInterval的问题。

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

onhashchange

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

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

【讨论】:

    【解决方案3】:

    不,setInterval 本身并不是 CPU 密集型的。如果您有很多在非常短的周期上运行的间隔(或在中等长的间隔上运行的非常复杂的操作),那么 很容易成为 CPU 密集型,具体取决于您的间隔正在做什么,并且他们这样做的频率。

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

    【讨论】:

      【解决方案4】:

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

      解释:

      一旦浏览器取得控制权,它就会依赖来自 底层操作系统和硬件接收控制和 发出 JavaScript 回调。在这些之间有更长的持续时间 中断允许硬件进入低功耗状态 显着降低功耗。 默认情况下,Microsoft Windows 操作系统和基于 Intel 处理器对这些中断使用 15.6 毫秒的分辨率(64 个中断 每秒)。这允许基于英特尔的处理器进入最低 电源状态。出于这个原因,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

      【讨论】:

        【解决方案5】:

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

        参考此链接About requestAnimationFrame

        【讨论】:

          【解决方案6】:

          Function time > 间隔时间不好,你不知道 cpu 什么时候打嗝或者很慢,它会叠加在正在进行的函数之上,直到 pc 冻结。使用 settimeout 甚至更好,process.nextick 在 settimeout 中使用回调。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-06-09
            • 2023-03-30
            • 1970-01-01
            • 1970-01-01
            • 2011-03-30
            • 2011-04-11
            • 2017-01-25
            相关资源
            最近更新 更多