我在某处读到setInterval占用大量CPU的信息。我创建了一个使用setInterval的脚本,并监视了CPU使用率,但没有发现任何变化。我想知道是否有什么我想念的。
代码要做的是每100毫秒检查一次URL中的哈希值(#后面的内容)是否更改,如果更改了,请使用AJAX加载页面。如果未更改,则什么都不会发生。会不会有CPU问题。
我在某处读到setInterval占用大量CPU的信息。我创建了一个使用setInterval的脚本,并监视了CPU使用率,但没有发现任何变化。我想知道是否有什么我想念的。
代码要做的是每100毫秒检查一次URL中的哈希值(#后面的内容)是否更改,如果更改了,请使用AJAX加载页面。如果未更改,则什么都不会发生。会不会有CPU问题。
Answers:
我认为不会setInterval
从本质上引起您严重的性能问题。我怀疑这种声誉可能来自更早的时代,当时CPU的功能不那么强大。
但是,有一些方法可以提高性能,并且这样做可能是明智的:
setInterval
,而不是字符串。不要过早地进行优化-在没有问题的情况下,不要让自己生活困难。
但是,在特定情况下可以做的一件事是在支持onhashchange
事件的浏览器中使用事件,而不是超时。
我宁愿说完全相反。正确使用setTimeout
和使用setInterval
,可以大大减少浏览器的CPU使用率。例如,使用setTimeout
而不是使用for
orwhile
循环不仅会降低CPU使用强度,而且还可以确保浏览器有机会更频繁地更新UI队列。因此,长时间运行的进程不会冻结并锁定用户体验。
但总的来说,setInterval
在您的网站上大量使用可能会减慢速度。20个同时运行的间隔或多或少的繁重工作都会影响演出。再说一遍..您真的可以弄乱我认为不是问题的任何部分setInterval
。
..顺便说一句,您不需要像这样检查哈希。有一些事件:
onhashchange
当哈希值发生变化时将触发。
window.addEventListener('hashchange', function(e) {
console.log('hash changed, yay!');
}, false);
在“ 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
就您而言,不会有任何问题。但是,如果您在画布上进行一些大型动画制作或使用webgl进行操作,则会出现一些CPU问题,因此可以使用requestAnimationFrame。
请参阅此链接关于requestAnimationFrame
函数时间>间隔时间不好,您不知道cpu何时打or或变慢,它会堆积在正在进行的功能之上,直到pc死机为止。使用settimeout或更好的方法,使用settimeout中的回调进行process.nextick。