是setInterval CPU密集型?

我读了一个setInterval是CPU密集型的地方。 我创build了一个使用setInterval的脚本,并监视CPU使用情况,但没有注意到有任何变化。 我想知道是否有一些我错过了。

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

我不认为setInterval本质上会导致你显着的性能问题。 我怀疑这个声誉可能来自一个早期的时代,当时CPU不那么强大。

有一些方法可以提高性能,但是,这可能是明智的做法:

  1. 传递一个函数给setInterval ,而不是一个string。
  2. 尽量less设置间隔。
  3. 尽可能长的间隔持续时间。
  4. 让代码每次运行尽可能简短和简单。

不要过早优化 – 当没有问题时不要让自己生活困难。

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

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

但一般来说,使用setInterval真的很像你的网站上可能会放慢的东西。 同时运行20个或多或less的繁重工作会影响演出。 然后再..你真的可以搞砸任何部分,我猜这不是一个setInterval的问题。

..顺便说一下,你不需要像这样检查哈希。 有这样的事件:

 onhashchange 

将会在散列发生变化时触发。

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

不, setInterval本身并不是CPU密集型的。 如果你在很短的周期内运行了很多的时间间隔(或者是一个非常复杂的操作,运行的时间间隔适中),那么很容易变成CPU密集型,这取决于你正在做什么,以及它们在做什么。

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

在“CPU密集型”这个术语下,有一些营销正在进行。 它的真正含义是“比一些替代scheme更多的CPU密集型”。 这不是“CPU密集型”,就像“像游戏或压缩algorithm一样使用大量的CPUfunction”。

说明:

一旦浏览器取得了控制权,就会依靠底层操作系统和硬件的中断来接收控制权并发出JavaScriptcallback。 在这些中断之间具有更长的持续时间允许硬件进入显着降低功耗的低功率状态。 默认情况下,Microsoft Windows操作系统和基于Intel的处理器对这些中断使用15.6ms的分辨率(每秒64个中断)。 这允许基于Intel的处理器进入其最低功耗状态。 由于这个原因,当使用HTML4浏览器(包括早期版本的Internet Explorer和Mozilla Firefox)时,web开发者传统上每秒只能使用setTimeout(0)实现64次callback。

在过去的两年中,浏览器试图增加JavaScript开发人员通过setTimeout和setInterval API的每秒callback次数,方法是更改​​注意力的Windows系统设置并防止硬件进入低功耗状态。 HTML5规范已经达到了每秒推荐250次callback的极限。 这种高频率可能导致功耗增加40%,影响电池寿命,运营开支和环境。 另外,这种方法不能解决提高CPU效率和调度的核心性能问题。

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

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

请参阅此链接关于requestAnimationFrame

function时间>间隔时间是坏的,你不能知道什么时候CPU打嗝或是慢的,它堆叠在正在进行的function,直到电脑死机。 使用settimeout甚至更好,在settimeout内使用callback进行process.nextick。