サイト上で下記のように画像などをループさせているのですが、CPUのファンが回りだしかなり使っているようです。setintervalはループの時間が長くてもかなりCPU使うのでしょうか?
```ここに言語を入力 function loop() { ループする処理 }; setInterval(loop, 17000);
もし思い込みではなく実際そのような問題がある場合解決方法があれば教えていただければ幸いです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
ループする処理の中身をもう少し具体的に欲しいですが、
setIntervalの仕様でこういう書き方してたらアウトです。
JavaScript
1function loop() { 2 // 1回分の処理 3 setInterval(loop, 17000); 4} 5setInterval(loop, 17000);
何故ダメかというと、setIntervalは第二引数の間隔で関数を叩き続ける機能だからです。
- 17秒後: 1個目のloop関数が実行
- 34秒後: 元々宣言してあったloopと、loop関数内で宣言されたloopの2個が同時に起動
- 51秒後: 元々宣言してあった2個のloopと、新たに宣言された2個のloopが同時に起動
…このように倍々で増えているのがわかります。
2の10乗は1024倍なので、170秒経過しただけでノートPCから煙吹いてもおかしくないですね。
ちょっとトイレに行くだけでブラウザが固まる大惨事確定でしょう。
もしそうならばsetIntervalではなくsetTimeoutを利用してください。
1回だけで終わる事が約束されているので、ねずみ算式に起動する関数が増えたりはしません。
setintervalはループの時間が長くてもかなりCPU使うのでしょうか?
そんなことはありません。
JavaScriptのsetIntervalを始めとするイベントループの機能はとても優秀で、
発火すべきタイミングまでひたすらサボり続ける低燃費の設計になっています。
【おまけ】 コメント欄のコード
外にあるi変数に依存しないようにしました。
こんな感じかなぁと思います。
JavaScript
1// DOMを触るので描画完了まで遅延させたほうが良い 2document.addEventListener("load", function () { 3 var items = [0, 1, 2, 3].map(function(it){ return document.getElementById('slide' + it); }); 4 var fadeIn = function (i) { 5 items[i].classList.add('slide-fadein'); 6 items[i].classList.remove('slide-fadeout'); 7 } 8 var fadeOut = function (i) { 9 items[i].classList.add('slide-fadeout'); 10 items[i].classList.remove('slide-fadein'); 11 } 12 var slideShow = function (i) { 13 if (i => items.length) { 14 i = 0; 15 } 16 fadeIn(i); 17 fadeOut(i === 0 ? items.length - 1 : i - 1); 18 setTimeout(slideShow.bind(null, i + 1), 18000); 19 } 20 setTimeout(slideShow.bind(null, 0), 18000); 21});
投稿2018/03/01 04:00
編集2018/03/01 11:37総合スコア21158
0
繰り返しそのものよりも中の処理自体に問題があるように思います。
処理内容の提示は可能でしょうか?
StackOverFlow(英語版)にも似たような質問があがっていました。
質問タイトルは「setIntervalはCPUに負荷をかけますか?」
に、対して、回答では幾つかコードや処理のロジックの最適化を促すようなコメントが付いています。
Google翻訳そのまま
私はsetIntervalが本質的にあなたに重大なパフォーマンス上の問題を引き起こすとは思わない。 私は、CPUがそれほど強力でない初期の時代から評判が来るかもしれないと思う。
ただし、パフォーマンスを向上させる方法はありますが、それを実行することをお勧めします。
1.文字列ではなく関数をsetIntervalに渡します。
2.可能な限り間隔をあけてください。
3.可能な限り間隔を長くします。
4.できるだけ短く簡単にコードを実行してください。
投稿2018/03/01 04:01
総合スコア80850
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/01 04:19
2018/03/01 04:24 編集
退会済みユーザー
2018/03/01 06:06
退会済みユーザー
2018/03/01 06:08
2018/03/01 06:15
退会済みユーザー
2018/03/01 06:17
0
setInterval()
は、 loop()
の処理が終わってなかろうが、
正確に17000ミリ秒ごとに繰り返しますので処理が重なっていき高負荷の原因になりますが、
ループ間隔に関しては、逆に短くするほど負荷となるかと思います。
setTimeout
でしたら、処理を終えてからループするので負荷は軽くなるかと思います。
投稿2018/03/01 04:00
総合スコア76
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/01 04:36
退会済みユーザー
2018/03/01 06:05
2018/03/01 06:12
2018/03/01 06:26
退会済みユーザー
2018/03/01 06:44
退会済みユーザー
2018/03/01 06:44
退会済みユーザー
2018/03/01 08:25
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/03/01 05:51
2018/03/01 05:53
退会済みユーザー
2018/03/01 06:04
2018/03/01 06:10
退会済みユーザー
2018/03/01 06:12
退会済みユーザー
2018/03/01 06:15
2018/03/01 06:22
退会済みユーザー
2018/03/01 06:33
2018/03/01 06:34
退会済みユーザー
2018/03/01 06:41
2018/03/01 06:41
退会済みユーザー
2018/03/01 06:53
退会済みユーザー
2018/03/01 07:14
2018/03/01 07:21
退会済みユーザー
2018/03/01 08:02
退会済みユーザー
2018/03/01 08:25