我在某处读到了setInterval是CPU密集型的。我创建了一个使用setInterval的脚本并监视CPU使用情况但没有注意到更改。我想知道是否有遗漏的东西。
代码的作用是每隔100毫秒检查URL中的哈希值(#之后的内容)是否有变化,如果已更改,则使用AJAX加载页面。如果它没有改变,没有任何反应。会不会有任何CPU问题。
答案 0 :(得分:57)
我认为setInterval
本身并不会导致严重的性能问题。我怀疑声誉可能来自早期的时代,当时CPU的功能不那么强大。
但是,有一些方法可以改善性能,而且这样做可能是明智之举:
setInterval
,而不是字符串。不要过早优化 - 在没有问题时不要让自己生活困难。
但是,您可以在特定情况下执行的一件事是在支持它的浏览器中使用onhashchange
事件而不是超时。
答案 1 :(得分:14)
我宁愿说这恰恰相反。正确使用setTimeout
和setInterval
可以大大减少浏览器的CPU使用率。例如,使用setTimeout
而不是使用for
或while
循环不仅会降低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。
答案 5 :(得分:1)
功能时间>间隔时间很糟糕,你不能知道cpu打嗝或慢速时它会堆积在正在进行的功能之上,直到pc冻结。使用settimeout甚至更好的方法,使用settimeout中的回调来处理process.nextick。