User Timing

W3C 勧告候補草案

この文書についての詳細
このバージョン:
https://www.w3.org/TR/2026/CRD-user-timing-20260311/
最新公開バージョン:
https://www.w3.org/TR/user-timing/
最新の編集者草案:
https://w3c.github.io/user-timing/
履歴:
https://www.w3.org/standards/history/user-timing
コミット履歴
テストスイート:
https://wpt.fyi/results/user-timing
実装レポート:
https://wpt.fyi/results/user-timing
編集者:
Nicolás Peña Moreno (Google)
以前の編集者:
Ilya Grigorik (Google)
Jatinder Mann (Microsoft Corp.) (2014年2月まで)
Zhiheng Wang (Google Inc.) (2013年7月まで)
Anderson Quach (Microsoft Corp.) (2011年3月まで)
フィードバック:
GitHub w3c/user-timing (プルリクエスト, 新しい issue, 未解決の issue)
public-web-perf@w3.org 宛てに 件名を [UserTiming] として送信してください (アーカイブ)
実装
User Timing は利用できますか?

概要

この仕様は、Web 開発者が高精度のタイムスタンプにアクセスできるようにすることで、アプリケーションのパフォーマンスを測定するのに役立つインターフェイスを定義します。

この文書のステータス

この節は、公開時点におけるこの 文書のステータスを説明するものです。現在の W3C 公開物と、この技術報告書の最新リビジョンの一覧は、 W3C 標準および草案 インデックスで確認できます。

この User Timing 仕様は、[USER-TIMING-2] を置き換えることを意図しており、以下を含みます:

この文書は、Web Performance Working Group により、 Recommendation track を用いた Candidate Recommendation Draft として公開されました。

Candidate Recommendation としての公開は、 W3C およびそのメンバーによる承認を意味するものではありません。Candidate Recommendation Draft は、ワーキンググループが後続の Candidate Recommendation Snapshot に含めることを意図している、 以前の Candidate Recommendation からの変更を統合します。

これは草案文書であり、いつでも他の文書によって更新、置換、または廃止される可能性があります。 作業中の文書以外のものとしてこの文書を引用することは不適切です。

この文書は、 W3C Patent Policy の下で運営されているグループによって作成されました。 W3C は、 そのグループの成果物に関連して行われた 特許開示の公開一覧 を維持しています。そのページには、特許を開示するための 手順も含まれています。ある個人が、 Essential Claim(s) を含むとその個人が考える特許について実際の知識を有している場合、その情報を W3C Patent Policy の第 6 節に従って開示しなければなりません。

この文書は、 2025年8月18日版 W3C Process Document によって管理されます。

1. はじめに

この節は非規範的です。

ウェブ開発者には、アプリケーションのパフォーマンス特性を評価し、理解する能力が必要です。 JavaScript [ECMA-262] は、 アプリケーションのレイテンシーを測定する仕組み(Date.now() メソッドから現在のタイムスタンプを取得すること)を提供しますが、 このタイムスタンプの精度はユーザーエージェントによって異なります。

この文書では、PerformanceMark および PerformanceMeasure インターフェイスと、 Performance インターフェイスの拡張を定義します。これらは高精度で 単調増加するタイムスタンプを公開し、開発者がアプリケーションのパフォーマンス 特性をより適切に測定できるようにします。

次のスクリプトは、この文書で定義されたインターフェイスを使用して、 開発者スクリプトに関連するタイミングデータを取得する方法を示しています。

async function run() {
  performance.mark("startTask1");
  await doTask1(); // 開発者コード
  performance.mark("endTask1");

  performance.mark("startTask2");
  await doTask2(); // 開発者コード
  performance.mark("endTask2");

  // それらをログに出力する
  const entries = performance.getEntriesByType("mark");
  for (const entry of entries) {
    console.table(entry.toJSON());
  }
}
run();
注記

[PERFORMANCE-TIMELINE-2] は、記録された指標を取得するために 使用できる 2 つの仕組みを定義しています。getEntries() および getEntriesByType() メソッドと、 PerformanceObserver インターフェイスです。前者は、 特定の時点で名前によって特定の指標を取得したい場合に最も適しており、 後者は、新しい指標が利用可能になったときに 通知を受け取りたい場合に最適化されています。

別の例として、クリックされると 新しいコンテンツを取得し、取得が完了したことを示す要素があるとします。 ユーザーがクリックしてから取得が 完了するまでの時間を報告したいとします。クリックハンドラーが実行される時刻をマークすると、 イベント処理のレイテンシーが含まれないため、その代わりにイベントの ハードウェアタイムスタンプを使用します。また、より詳細な分析を行うために コンポーネントの名前も知りたいとします。

element.addEventListener("click", e => {
  const component = getComponent(element);
  fetch(component.url).then(() => {
    element.textContent = "更新済み";
    const updateMark = performance.mark("update_component", {
      detail: {component: component.name},
    });
    performance.measure("click_to_update_component", {
      detail: {component: component.name},
      start: e.timeStamp,
      end: updateMark.startTime,
    });
  });
});

2. 適合性

非規範的と明示された節に加え、この仕様におけるすべての作成者向けガイドライン、図、例、および注記は 非規範的です。この仕様のそれ以外のすべては規範的です。

この文書におけるキーワード MAY および MUST は、 ここに示すようにすべて 大文字で現れる場合に限り、 BCP 14 [RFC2119] [RFC8174] に記述されているように解釈されます。

一部の適合要件は、属性、 メソッド、またはオブジェクトに対する要件として表現されています。そのような要件は、 ユーザーエージェントに対する要件として解釈されます。

この仕様の IDL 断片は、Web IDL 仕様で説明される適合する IDL 断片に必要なものとして解釈されなければなりません。 [WEBIDL]

3. ユーザータイミング

3.1 Performance インターフェイスの拡張

Performance インターフェイスおよび DOMHighResTimeStamp は [HR-TIME-2] で定義されています。 PerformanceEntry インターフェイスは [PERFORMANCE-TIMELINE-2] で定義されています。

WebIDLdictionary PerformanceMarkOptions {
    any detail;
    DOMHighResTimeStamp startTime;
};

dictionary PerformanceMeasureOptions {
    any detail;
    (DOMString or DOMHighResTimeStamp) start;
    DOMHighResTimeStamp duration;
    (DOMString or DOMHighResTimeStamp) end;
};

partial interface Performance {
    PerformanceMark mark(DOMString markName, optional PerformanceMarkOptions markOptions = {});
    undefined clearMarks(optional DOMString markName);
    PerformanceMeasure measure(DOMString measureName, optional (DOMString or PerformanceMeasureOptions) startOrMeasureOptions = {}, optional DOMString endMark);
    undefined clearMeasures(optional DOMString measureName);
};

3.1.1 mark() メソッド

関連付けられた名前を持つタイムスタンプ(「マーク」)を格納します。これは次の 手順を実行しなければなりません

  1. PerformanceMark コンストラクターを実行し、 entry を新しく作成されたオブジェクトとします。
  2. entryキューに入れます
  3. entryパフォーマンス エントリーバッファーに追加します。
  4. entry を返します。
3.1.1.1 PerformanceMarkOptions 辞書
detail
マークに含めるメタデータ。
startTime
マーク時刻として使用するタイムスタンプ。

3.1.2 clearMarks() メソッド

関連付けられた名前を持つ格納済みタイムスタンプを削除します。これは次の 手順を実行しなければなりません

  1. markName が省略されている場合、すべての PerformanceMark オブジェクトを パフォーマンス エントリーバッファーから削除します。
  2. そうでない場合、パフォーマンス エントリーバッファーに列挙されている PerformanceMark オブジェクトのうち、 namemarkName であるものをすべて削除します。
  3. undefined を返します。

3.1.3 measure() メソッド

2 つのマーク間の DOMHighResTimeStamp 期間を、関連付けられた名前(「メジャー」)とともに格納します。これは次の手順を実行しなければなりません

  1. startOrMeasureOptionsPerformanceMeasureOptions オブジェクトであり、startendduration、および detail の少なくとも 1 つが 存在する場合、次の チェックを実行します。
    1. endMark が指定されている場合、TypeErrorスローします。
    2. startOrMeasureOptionsstart および end メンバーが どちらも省略されている場合、TypeErrorスローします。
    3. startOrMeasureOptionsstartduration、および end メンバーがすべて 存在する場合、TypeErrorスローします。
  2. end time を次のように計算します。
    1. endMark が指定されている場合、end time を、 endMark を渡して マークを タイムスタンプに変換するアルゴリズムを実行して返される値とします。
    2. そうでなく、startOrMeasureOptionsPerformanceMeasureOptions オブジェクトであり、その end メンバーが 存在する場合、 end time を、startOrMeasureOptionsend を渡して マークをタイムスタンプに変換する アルゴリズムを実行して返される値とします。
    3. そうでなく、startOrMeasureOptionsPerformanceMeasureOptions オブジェクトであり、その start および duration メンバーがどちらも 存在する場合:
      1. start を、start を渡して マークを タイムスタンプに変換するアルゴリズムを実行して返される値とします。
      2. duration を、duration を渡して マークを タイムスタンプに変換するアルゴリズムを実行して返される値とします。
      3. end timestartduration の和とします。
    4. そうでない場合、end timePerformance オブジェクトの now() メソッドによって返される値とします。
  3. start time を次のように計算します。
    1. startOrMeasureOptionsPerformanceMeasureOptions オブジェクトであり、その start メンバーが 存在する場合、 start time を、startOrMeasureOptionsstart を渡して マークをタイムスタンプに変換する アルゴリズムを実行して返される値とします。
    2. そうでなく、startOrMeasureOptionsPerformanceMeasureOptions オブジェクトであり、その duration および end メンバーがどちらも 存在する場合:
      1. duration を、duration を渡して マークを タイムスタンプに変換するアルゴリズムを実行して返される値とします。
      2. end を、end を渡して マークを タイムスタンプに変換するアルゴリズムを実行して返される値とします。
      3. start timeend から duration を引いた値とします。
    3. そうでなく、startOrMeasureOptionsDOMString である場合、 start time を、startOrMeasureOptions を渡して マークをタイムスタンプに変換する アルゴリズムを実行して返される値とします。
    4. そうでない場合、start time0 とします。
  4. this関連する Realmを使用して、新しい PerformanceMeasure オブジェクト (entry)を作成します。
  5. entryname 属性を measureName に設定します。
  6. entryentryType 属性を DOMString "measure" に設定します。
  7. entrystartTime 属性を start time に設定します。
  8. entryduration 属性を start time から end time までの期間に設定します。結果の期間値は負であってもかまいません
  9. entrydetail 属性を次のように設定します。
    1. startOrMeasureOptionsPerformanceMeasureOptions オブジェクトであり、startOrMeasureOptionsdetail メンバーが 存在する場合:
      1. record を、startOrMeasureOptionsdetail に対して StructuredSerialize アルゴリズムを呼び出した結果とします。
      2. entrydetail を、 record および 現在の Realmに対して StructuredDeserialize アルゴリズムを呼び出した結果に設定します。
    2. そうでない場合、null に設定します。
  10. entryキューに入れます
  11. entryパフォーマンス エントリーバッファーに追加します。
  12. entry を返します。
3.1.3.1 PerformanceMeasureOptions 辞書
detail
メジャーに含めるメタデータ。
start
開始時刻として使用するタイムスタンプ、または開始マークとして使用する文字列。
duration
開始時刻と終了時刻の間の期間。
end
終了時刻として使用するタイムスタンプ、または終了マークとして使用する文字列。

3.1.4 clearMeasures() メソッド

関連付けられた名前を持つ格納済みタイムスタンプを削除します。これは次の手順を実行しなければなりません

  1. measureName が省略されている場合、パフォーマンス エントリーバッファー内のすべての PerformanceMeasure オブジェクトを削除します。
  2. そうでない場合、パフォーマンス エントリーバッファーに列挙されている PerformanceMeasure オブジェクトのうち、 namemeasureName であるものをすべて削除します。
  3. undefined を返します。

3.2 PerformanceMark インターフェイス

PerformanceMark インターフェイスは、Performance インターフェイスの mark() メソッドによって作成されたマークも Performance Timeline に公開します。

WebIDL[Exposed=(Window,Worker)]
interface PerformanceMark : PerformanceEntry {
  constructor(DOMString markName, optional PerformanceMarkOptions markOptions = {});
  readonly attribute any detail;
};

PerformanceMark インターフェイスは、PerformanceEntry インターフェイスの次の属性を拡張します。

name 属性はマークの名前を返さなければなりません。

entryType 属性は DOMString "mark" を返さなければなりません。

startTime 属性は、マークの時刻値を持つ DOMHighResTimeStamp を返さなければなりません。

duration 属性は、値 0DOMHighResTimeStamp を返さなければなりません。

PerformanceMark インターフェイスには、次の 追加属性があります。

detail 属性は設定された値を返さなければなりません(これは PerformanceMarkOptions 辞書からコピーされます)。

3.2.1 PerformanceMark コンストラクター

PerformanceMark コンストラクターは、次の 手順を実行しなければなりません。

  1. 現在の グローバルオブジェクトWindow オブジェクトであり、markNamePerformanceTiming インターフェイスの 読み取り専用属性と同じ名前を 使用している場合、SyntaxErrorスローします。
  2. 現在の グローバルオブジェクトRealmを使用して、 新しい PerformanceMark オブジェクト (entry)を作成します。
  3. entryname 属性を markName に設定します。
  4. entryentryType 属性を DOMString "mark" に設定します。
  5. entrystartTime 属性を次のように設定します。
    1. markOptionsstartTime メンバーが 存在する場合:
      1. markOptionsstartTime が負の場合、TypeError をスローします。
      2. そうでない場合、entrystartTimemarkOptionsstartTime の値に設定します。
    2. そうでない場合、Performance オブジェクトの now() メソッドによって返される値に設定します。
  6. entryduration 属性を 0 に設定します。
  7. markOptionsdetail が null の場合、 entrydetail を null に設定します。
  8. そうでない場合:
    1. record を、markOptionsdetail に対して StructuredSerialize アルゴリズムを呼び出した結果とします。
    2. entrydetail を、 record および 現在の Realmに対して StructuredDeserialize アルゴリズムを呼び出した結果に設定します。

3.3 PerformanceMeasure インターフェイス

PerformanceMeasure インターフェイスは、 Performance インターフェイスの measure() メソッドによって作成されたメジャーも Performance Timeline に公開します。

WebIDL[Exposed=(Window,Worker)]
interface PerformanceMeasure : PerformanceEntry {
  readonly attribute any detail;
};

PerformanceMeasure インターフェイスは、 PerformanceEntry インターフェイスの次の属性を拡張します。

name 属性はメジャーの名前を返さなければなりません。

entryType 属性は DOMString "measure" を返さなければなりません。

startTime 属性は、メジャーの開始マークを持つ DOMHighResTimeStamp を返さなければなりません。

duration 属性は、メジャーの期間を持つ DOMHighResTimeStamp を返さなければなりません。

PerformanceMeasure インターフェイスには、 次の追加属性があります。

detail 属性は設定された値を返さなければなりません(これは PerformanceMeasureOptions 辞書からコピーされます)。

4. 処理

注記

User Timing API を実装するユーザーエージェントは、"mark" および "measure" supportedEntryTypes に含める必要があります。これにより、開発者は User Timing のサポートを検出できます。

4.1 marktimestamp に変換する

DOMString または DOMHighResTimeStamp である mark が与えられたとき、マークをタイムスタンプに変換するには、次の手順を実行します。

  1. markDOMString であり、 PerformanceTiming インターフェイスの 読み取り専用属性と同じ名前を持つ場合、 end time を、namemark の値に設定して 名前をタイムスタンプに変換するアルゴリズムを 実行して返される値とします。
  2. そうでなく、markDOMString である場合、end time を、 パフォーマンス エントリーバッファー内の PerformanceMark オブジェクトのうち、 namemark であるものの最新の出現から取得した startTime 属性の値とします。一致するエントリーが 見つからない場合、SyntaxErrorスローします。
  3. そうでなく、markDOMHighResTimeStamp である場合:
    1. mark が負の場合、TypeError をスローします。
    2. そうでない場合、end timemark とします。

4.2 nametimestamp に変換する

PerformanceTiming インターフェイスの 読み取り専用 属性である name が与えられたとき、 名前を タイムスタンプに変換するには、 次の手順を実行します。

  1. グローバル オブジェクトWindow オブジェクトでない場合、TypeErrorスローします。
  2. namenavigationStart の場合、0 を返します。
  3. startTime を、 PerformanceTiming インターフェイス内の navigationStart の値とします。
  4. endTime を、 PerformanceTiming インターフェイス内の name の値とします。
  5. endTime0 の場合、InvalidAccessErrorスローします。
  6. endTime から startTime を引いた結果を返します。
注記

PerformanceTiming インターフェイスは [NAVIGATION-TIMING] で定義され、 現在では廃止されたものと見なされています。PerformanceTiming インターフェイスの名前の使用は後方互換性を維持するためにサポートされていますが、将来、 この機能を [NAVIGATION-TIMING-2] で定義される PerformanceNavigationTiming インターフェイス(またはその他のインターフェイス)の名前へ拡張する予定はありません。

6. プライバシーとセキュリティ

この節は非規範的です。

この仕様で定義されるインターフェイスは、ページ上の特定の JavaScript 活動に関する、 潜在的に機密性の高いタイミング情報を公開します。 高解像度タイミング情報を公開することに関するプライバシーおよびセキュリティ上の考慮事項については、 [HR-TIME-2] を参照してください。

ウェブプラットフォームは、ページに含まれるどのスクリプトも、 それぞれのスクリプトのオリジンに関係なく、 同じページに含まれる他のどのスクリプトとも同じアクセス権を持つという不変条件に基づいて 設計されているため、この仕様で定義される インターフェイスは、記録されたタイミング情報の 記録または取得にいかなる制限も設けません。すなわち、ページに含まれる任意のスクリプトによって記録された ユーザータイミングのマークまたはメジャーは、オリジンに関係なく、 同じページ上で実行されている他の任意のスクリプトから読み取ることができます。

A. 謝辞

この作業への貢献について、 James Simonsen、 Jason Weber、 Nic Jansma、 Philippe Le Hegaret、 Karen Anderson、 Steve Souders、 Sigbjorn Vik、 Todd Reifsteck、および Tony Gentilcore に感謝します。

B. 参考文献

B.1 規範的参考文献

[HR-TIME-2]
High Resolution Time Level 2。Ilya Grigorik。W3C。2019 年 11 月 21 日。W3C 勧告。URL: https://www.w3.org/TR/hr-time-2/
[HTML]
HTML Standard。Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters。WHATWG。現行 標準。URL: https://html.spec.whatwg.org/multipage/
[infra]
Infra Standard。Anne van Kesteren; Domenic Denicola。WHATWG。現行標準。URL: https://infra.spec.whatwg.org/
[NAVIGATION-TIMING]
Navigation Timing。Zhiheng Wang。 W3C。2012 年 12 月 17 日。W3C 勧告。URL: https://www.w3.org/TR/navigation-timing/
[PERFORMANCE-TIMELINE-2]
Performance Timeline。Nicolas Pena Moreno。W3C。2025 年 5 月 21 日。CRD。URL: https://www.w3.org/TR/performance-timeline/
[RFC2119]
要件レベルを示すために RFC で使用する キーワード。S. Bradner。IETF。1997 年 3 月。現在のベストプラクティス。URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
RFC 2119 のキーワードにおける大文字と小文字の曖昧さ。B. Leiba。IETF。2017 年 5 月。現在のベストプラクティス。URL: https://www.rfc-editor.org/rfc/rfc8174
[WEBIDL]
Web IDL Standard。Edgar Chen; Timothy Gu。 WHATWG。現行標準。URL: https://webidl.spec.whatwg.org/

B.2 参考文献

[ECMA-262]
ECMAScript 言語仕様。 Ecma International。URL: https://tc39.es/ecma262/multipage/
[NAVIGATION-TIMING-2]
Navigation Timing Level 2。 Yoav Weiss; Noam Rosenthal。W3C。2026 年 2 月 25 日。W3C 作業草案。URL: https://www.w3.org/TR/navigation-timing-2/
[USER-TIMING-2]
User Timing Level 2。Ilya Grigorik。 W3C。2019 年 2 月 26 日。W3C 勧告。URL: https://www.w3.org/TR/user-timing-2/