萌えハッカーニュースリーダー

2025/09/01 19:20 Why do browsers throttle JavaScript timers?

出典: https://nolanlawson.com/2025/08/31/why-do-browsers-throttle-javascript-timers/
hakase
博士

ロボ子、今日のITニュースは`setTimeout(0)`の意外な挙動についてじゃ。

roboko
ロボ子

`setTimeout(0)`、ですか?すぐに実行されると思っていましたが…。

hakase
博士

そう思うじゃろ?でも実際には、ブラウザによっては4ms後に実行されることがあるんじゃと!

roboko
ロボ子

4msも遅延するんですか?それはなぜでしょう?

hakase
博士

ブラウザがバッテリー消費を抑えたり、インタラクティブ性を保つために、`setTimeout`の最小時間を4msに設定しているからじゃ。レガシーEdgeやChromeのバックグラウンドタブでは、もっと厳しくスロットリングされることもあるらしいぞ。

roboko
ロボ子

なるほど。`fake-indexeddb`でIndexedDBトランザクションの自動コミットに`setTimeout`を使った際に、Chromeで遅延が発生したのは、この影響だったんですね。

hakase
博士

`fake-indexeddb`だと、Node.jsに比べてChromeで16倍も遅延したらしいのじゃ。これは深刻じゃな。

roboko
ロボ子

代替手段はあるのでしょうか?

hakase
博士

`setImmediate`、`MessageChannel.postMessage`、`window.postMessage`、`scheduler.postTask`といった選択肢があるぞ。

roboko
ロボ子

それぞれの性能はどうなんでしょう?

hakase
博士

ベンチマークによると、ChromeとFirefoxでは`setTimeout`が4msに制限されるけど、他の選択肢はほぼ同等みたいじゃ。Safariでは`setTimeout`がさらに制限されるらしい。

roboko
ロボ子

`fake-indexeddb`では、最終的に`scheduler.postTask`を採用したんですね。

hakase
博士

そうじゃ。フォールバックとして`MessageChannel.postMessage`か`window.postMessage`を使うみたいじゃな。

roboko
ロボ子

なぜブラウザは`setTimeout`を制限するんでしょう?

hakase
博士

Web開発者がAPIを過度に使ったり、より良い選択肢を知らないからじゃ、とのことじゃ。

roboko
ロボ子

`scheduler.postTask`と`postMessage`は、今のところスロットリングされないと予測されているんですね。

hakase
博士

当面は大丈夫そうじゃな。`setInterval`についても、`setTimeout`と同様のことが言えるらしいぞ。

roboko
ロボ子

`fake-indexeddb`では、Safariで`setTimeout`が`MessageChannel`や`window.postMessage`よりも優先されるという興味深い現象も確認されたんですね。

hakase
博士

ブラウザごとの挙動の違い、奥が深いのじゃ。しかし、setTimeoutがsetTimeoutしないとは、これいかに?

roboko
ロボ子

まるで、待ち合わせに遅刻してくる人のようですね。

hakase
博士

うむ。setTimeoutだけに、時間通りにセットしてくれ!…って、ダジャレじゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search