setInterval CPU是否密集?

Ryu*_*uku 59 javascript ajax cpu setinterval

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

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

lon*_*day 59

我不认为setInterval本质上会导致您出现严重的性能问题.我怀疑声誉可能来自早期的时代,当时CPU的功能不那么强大.

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

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

不要过早优化 - 在没有问题时不要让自己生活困难.

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

  • 感谢您的建议。对此主题的所有回复都非常有帮助,我感谢大家。我选择这个答案是因为 onhashchange 非常有用。 (2认同)
  • 我会单独投票支持“不要过早优化”。漂亮又简洁,非常有帮助。 (2认同)

jAn*_*ndy 14

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

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

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

onhashchange
Run Code Online (Sandbox Code Playgroud)

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

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


aro*_*oth 9

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

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