Research record · v1 · 2026年8月11日
JavaScript Timer の精度:ブラウザ倒計時の状態復元ベンチマーク
固定減算、deadline - Date.now()、performance.now() の単調参照を同じコールバックで比較し、 コールバック遅延・残り時間誤差・終了検知遅延を分けて公開します。
Summary
遅いコールバックと、ずれた残り時間は同じではありません
今回の固定環境では、2 つの主スレッド停止条件とも、固定減算の試行最大絶対残り時間誤差の中央値が deadline 再計算より大きくなりました。 これは公開した v1 試行だけの記述です。
一方で、deadline 再計算も JavaScript が再び実行される前に音や通知を鳴らすことはできません。 そのため表示の状態復元と、終了を検知できた時刻を別の指標として読みます。
周期的な 280 ms 停止
- 固定減算
- 881.5 ms
- deadline - Date.now()
- 0.7 ms
終了時刻をまたぐ 900 ms 停止
- 固定減算
- 400 ms
- deadline - Date.now()
- 0.6 ms
共通スケール。棒はコールバックが准時だったことを示しません。
Three measures
3 つの指標を混ぜずに読む
- Callback lateness
- 名目上のコールバック順序に対して、実際の callback が何 ms 遅れて観測されたか。
- Remaining-time error
- 同じ callback 内で、各方式の残り値が単調参照の残り値と何 ms 違ったか。
- Completion-detection lateness
- 単調 deadline 後、各方式が最初に 0 を観測できるまで何 ms かかったか。
Results
v1 シナリオ別結果
値は有効な測定試行の記述統計です。優劣の総合点や統計的有意差は計算していません。
| シナリオ | 有効/計画 | Callback lateness p95 | 固定減算 最大誤差 中央値 | Deadline 最大誤差 中央値 | 固定減算 終了検知 中央値 | Deadline 終了検知 中央値 |
|---|---|---|---|---|---|---|
| 前景・アイドル | 10/10 | 2 ms | 2.1 ms | 0.7 ms | 1.5 ms | 1.5 ms |
| 周期的な 280 ms 停止 | 10/10 | 802 ms | 881.5 ms | 0.7 ms | 801.7 ms | 1.4 ms |
| 終了時刻をまたぐ 900 ms 停止 | 10/10 | 901.7 ms | 400 ms | 0.6 ms | 901.6 ms | 501.7 ms |
推奨引用形式
Taimaa.net「JavaScript Timer の精度:ブラウザ倒計時の状態復元ベンチマーク」v1、2026年8月11日、https://taimaa.net/research/javascript-timer-accuracy#benchmark-v1-scope-and-result
33 試行の安定アンカーを表示
各アンカーは trial_id と一致します。callback 単位の値は observations.csv で監査できます。
- warmup-foreground-idle-01前景・アイドルwarm-up · retained
- measured-foreground-idle-01前景・アイドルmeasured · valid
- measured-foreground-idle-02前景・アイドルmeasured · valid
- measured-foreground-idle-03前景・アイドルmeasured · valid
- measured-foreground-idle-04前景・アイドルmeasured · valid
- measured-foreground-idle-05前景・アイドルmeasured · valid
- measured-foreground-idle-06前景・アイドルmeasured · valid
- measured-foreground-idle-07前景・アイドルmeasured · valid
- measured-foreground-idle-08前景・アイドルmeasured · valid
- measured-foreground-idle-09前景・アイドルmeasured · valid
- measured-foreground-idle-10前景・アイドルmeasured · valid
- warmup-periodic-stalls-01周期的な 280 ms 停止warm-up · retained
- measured-periodic-stalls-01周期的な 280 ms 停止measured · valid
- measured-periodic-stalls-02周期的な 280 ms 停止measured · valid
- measured-periodic-stalls-03周期的な 280 ms 停止measured · valid
- measured-periodic-stalls-04周期的な 280 ms 停止measured · valid
- measured-periodic-stalls-05周期的な 280 ms 停止measured · valid
- measured-periodic-stalls-06周期的な 280 ms 停止measured · valid
- measured-periodic-stalls-07周期的な 280 ms 停止measured · valid
- measured-periodic-stalls-08周期的な 280 ms 停止measured · valid
- measured-periodic-stalls-09周期的な 280 ms 停止measured · valid
- measured-periodic-stalls-10周期的な 280 ms 停止measured · valid
- warmup-deadline-crossing-stall-01終了時刻をまたぐ 900 ms 停止warm-up · retained
- measured-deadline-crossing-stall-01終了時刻をまたぐ 900 ms 停止measured · valid
- measured-deadline-crossing-stall-02終了時刻をまたぐ 900 ms 停止measured · valid
- measured-deadline-crossing-stall-03終了時刻をまたぐ 900 ms 停止measured · valid
- measured-deadline-crossing-stall-04終了時刻をまたぐ 900 ms 停止measured · valid
- measured-deadline-crossing-stall-05終了時刻をまたぐ 900 ms 停止measured · valid
- measured-deadline-crossing-stall-06終了時刻をまたぐ 900 ms 停止measured · valid
- measured-deadline-crossing-stall-07終了時刻をまたぐ 900 ms 停止measured · valid
- measured-deadline-crossing-stall-08終了時刻をまたぐ 900 ms 停止measured · valid
- measured-deadline-crossing-stall-09終了時刻をまたぐ 900 ms 停止measured · valid
- measured-deadline-crossing-stall-10終了時刻をまたぐ 900 ms 停止measured · valid
Method & release
方法、環境、公開データ
事前に固定した実行条件
- 間隔 100 ms、名目時間 4,000 ms。
- 前景アイドル、800 ms ごとの 280 ms 停止、終了時刻をまたぐ 900 ms 停止。
- 各条件はウォームアップ 1 回の後、測定 10 回。各条件 8 回以上の有効試行を必須としました。
- wall/monotonic の相対オフセット跳変が 50 ms を超えた試行は除外。除外理由はすべて公開します。
- 同一 callback で 1 組の
Date.now()/performance.now()を読み、3 方式すべてに使いました。
実行環境
- ブラウザ
- Chrome/151.0.7922.108
- OS
- macOS 26.5.1 (25F80)
- ハードウェア
- Mac17,4
- 言語・時刻帯
- zh-CN · Asia/Shanghai
- Visibility
- visible
- Harness SHA-256
- ff3b78efa2cc7fe8df9f7bfbd2bf9368ac1fc56cda03da3367c66020c971d482
普通のタイマー利用での意味
ページが重くなった後に残り時間を復元するには、callback の回数だけを減らすより、目標終了時刻から残り値を再計算する方が今回の停止条件では誤差を抑えました。 ただし、重い処理の最中に終了音や通知を准時に発火できるという意味ではありません。
制限
この v1 は固定した 1 つの Chrome / macOS / ハードウェア環境の前景試行です。 全ブラウザ、モバイル、バックグラウンドタブ、スリープ復帰、長時間運転、音・通知の開始時刻、法的または安全上重要な計時を対象にしません。Date.now() はシステム時計変更の影響を受けます。
背景資料
以下は仕様と実装上の背景資料です。Taimaa.net の実測結果そのものではありません。
- WHATWG HTML — Timers
タイマー初期化、最小遅延、タスクのキューイング
- W3C High Resolution Time Level 3
performance.now() と単調クロック
- WHATWG HTML — Page Visibility
文書の visibility state と visibilitychange
- MDN — Reasons for delays longer than specified
遅いコールバックとブラウザ依存ポリシーの背景説明
版と訂正
v1 は 2026年8月11日 に作成した固定リリースです。現在、訂正はありません。 公開済みファイルは上書きせず、訂正時は旧 URL を保存したまま新しい版と変更区分を追加します。
Capture SHA-256: 4d93525e58265df70e576ae92554820a5cb6fa5030fea2dae6b96ef9585a87bf
実際のカウントダウンを使う場合は、Taimaa.net の無料オンラインタイマーに戻れます。
タイマーを使う