web-dev-qa-db-ja.com

setIntervalはCPUを集中的に使用しますか?

どこかでsetIntervalがCPUを集中的に使用することを読みました。 setIntervalを使用するスクリプトを作成し、CPU使用率を監視しましたが、変更に気付きませんでした。私が見逃したものがあるかどうか知りたいです。

コードが行うことは、100ミリ秒ごとにURLのハッシュ(#以降のコンテンツ)の変更をチェックし、変更されている場合は、AJAXを使用してページをロードします。変更されていない場合、何も起こりません。 CPUに問題がありますか?.

59
Ryuku

setIntervalが本質的に重大なパフォーマンスの問題を引き起こすとは思わない。 CPUがそれほど強力ではなかった初期の時代から評判が来るのではないかと思います。

ただし、パフォーマンスを改善する方法はありますが、おそらくそれを行うのが賢明です。

  1. 文字列ではなく、setIntervalに関数を渡します。
  2. できるだけ少ない間隔を設定してください。
  3. 間隔をできるだけ長くします。
  4. コードをできる限り短く簡単に実行するようにします。

時期尚早に最適化しないでください-問題がないときに自分の人生を難しくしないでください。

ただし、特定の場合にできることの1つは、それをサポートするブラウザーでタイムアウトではなくonhashchangeイベントを使用することです。

59
lonesomeday

むしろ逆だと思います。 setTimeoutおよびsetIntervalを正しく使用すると、ブラウザーのCPU使用率を大幅に削減できます。たとえば、setTimeoutループまたはforループを使用する代わりにwhileを使用すると、CPU使用率が低下するだけでなく、ブラウザーが更新される可能性も保証されます。 UIキューをより頻繁に。そのため、長時間実行されているプロセスはフリーズせず、ユーザーエクスペリエンスがロックされません。

ただし、一般的に、サイトでsetIntervalを非常に多く使用すると、速度が低下する可能性があります。多かれ少なかれ重労働で20の同時実行間隔がショーに影響します。そして再び.. setIntervalの問題ではないと思う部分を本当に混乱させることができます。

..ところで、そのようなハッシュをチェックする必要はありません。そのためのイベントがあります:

onhashchange

ハッシュに変更があったときに起動します。

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

いいえ、setIntervalはそれ自体CPUを集中的に使用しません。非常に短いサイクルで実行されている多くの間隔がある場合(または、適度に長い間隔で実行されている非常に複雑な操作)、thatは、正確に間隔が何をしているかによって、彼らがそれをしている頻度。

間隔で100ミリ秒ごとにURLをチェックすることで問題が発生することはないと思いますが、個人的には間隔を250ミリ秒に増やします。特に、ほとんどの場合、何もしないことが予想されるものについては、私が逃げることができると思う最長のタイムアウト間隔を使用しようとするためです。

9
aroth

「CPU集中型」という用語では、マーケティングが少しあります。それが本当に意味するのは、「いくつかの代替手段よりもCPUを集中的に使用する」ことです。 「ゲームや圧縮アルゴリズムのようにCPUパワーを大量に使用する」などの「CPU集約型」ではありません。

説明 :

ブラウザが制御を取得すると、基盤となるオペレーティングシステムとハードウェアからの割り込みに依存して制御を受け取り、JavaScriptコールバックを発行します。これらの割り込みの間隔を長くすると、ハードウェアが低電力状態になり、消費電力が大幅に削減されます。デフォルトでは、Microsoft WindowsオペレーティングシステムおよびIntelベースのプロセッサは、これらの割り込みに15.6msの解像度を使用します(1秒あたり64個の割り込み)。これにより、Intelベースのプロセッサが最低電力状態になります。このため、Web開発者は従来、Internet ExplorerおよびMozilla Firefoxの以前のエディションを含むHTML4ブラウザーを使用している場合にsetTimeout(0)を使用すると、1秒あたり64コールバックしか達成できませんでした。

過去2年間、ブラウザーは、電力を重視するWindowsシステム設定を変更し、ハードウェアが低電力状態にならないようにすることにより、setTimeoutおよびsetInterval APIを介してJavaScript開発者が受信できるコールバックの1秒あたりの数を増やしようとしました。 HTML5仕様は、1秒あたり250回のコールバックを推奨するという極端なものになりました。この高頻度により、消費電力が40%増加し、バッテリー寿命、運用費用、および環境に影響を与える可能性があります。さらに、このアプローチでは、CPUの効率とスケジューリングを改善するというコアパフォーマンスの問題に対処していません。

から http://ie.Microsoft.com/testdrive/Performance/setImmediateSorting/Default.html

4
user703016

あなたの場合、問題はありません。ただし、キャンバスでいくつかの巨大なアニメーションを実行する場合、またはwebglで作業する場合は、CPUの問題が発生するため、requestAnimationFrameを使用できます。

このリンクを参照してください requestAnimationFrameについて

3
Sarath

関数の時間>間隔の時間は悪いです。cpuがしゃっくりするのが遅いか、遅いのかわからず、pcがフリーズするまで進行中の関数の上にスタックします。 settimeoutを使用するか、さらに良いことに、settimeout内でコールバックを使用してprocess.nextickを使用します。