パフォーマンスタイムライン

W3C 候補勧告草案

この文書の詳細
このバージョン:
https://www.w3.org/TR/2025/CRD-performance-timeline-20250521/
最新公開バージョン:
https://www.w3.org/TR/performance-timeline/
最新編集者ドラフト:
https://w3c.github.io/performance-timeline/
履歴:
https://www.w3.org/standards/history/performance-timeline
コミット履歴
テストスイート:
https://github.com/web-platform-tests/wpt/tree/master/performance-timeline
実装レポート:
https://wpt.fyi/results/performance-timeline
編集者:
Nicolás Peña Moreno (Google)
以前の編集者:
Ilya Grigorik (Google)
(Microsoft Corp.) (2014年11月まで)
Zhiheng Wang (Google) (2013年7月まで)
フィードバック:
GitHub w3c/performance-timeline (プルリクエスト, 新しい課題, オープン課題)

概要

この仕様は、High Resolution Time 仕様 [HR-TIME-3] を拡張し、高解像度のパフォーマンス指標データの保存および取得のためのメソッドを提供します。

この文書のステータス

このセクションは、公開時点での本書のステータスについて説明します。現行の W3C 公開文書一覧や、この技術レポートの最新改訂版は W3C 標準および草案インデックス(https://www.w3.org/TR/)で確認できます。

このパフォーマンスタイムライン仕様は、初版 [PERFORMANCE-TIMELINE] を置き換え、以下を含みます:

この文書は Web Performance Working Group勧告トラックを用いて 候補勧告草案として公開したものです。

候補勧告としての公開は、W3C およびその会員による承認を意味しません。候補勧告草案は、ワーキンググループが次回の候補勧告スナップショットに含める予定の変更を前回の候補勧告から統合した文書です。

本書はドラフト文書であり、今後随時更新・置換・廃止される場合があります。進行中の作業以外として引用することは適切ではありません。

本書は、W3C 特許ポリシーのもとで活動するグループによって作成されました。 W3C は、 公開特許開示リストを管理しています。 このページには特許の開示方法についての案内も記載されています。特許に関する実際の知識を持つ個人は、 エッセンシャルクレーム を含むと考えられる場合、W3C特許ポリシー第6節に従って情報開示が必要です。

本書は 2023年11月3日版 W3C プロセス文書に従って管理されています。

1. はじめに

このセクションは規範的ではありません。

ウェブアプリケーションのパフォーマンス特性を正確に測定することは、ウェブアプリケーションを高速化する上で重要な要素です。この仕様では、ウェブ開発者がウェブアプリケーションのライフサイクル全体から様々なパフォーマンス指標にアクセス・計測・取得できるようにするための パフォーマンスタイムライン の基本要素を定義しています。

[NAVIGATION-TIMING-2]、[RESOURCE-TIMING-2]、および [USER-TIMING-2] は、それぞれドキュメントのナビゲーション、ページ上のリソース、そして開発者スクリプトに関連するタイミング情報を定義する仕様の例です。これらや他のパフォーマンスインターフェースを組み合わせることで、ウェブアプリケーションの パフォーマンスタイムライン を説明するパフォーマンス指標を定義できます。例えば、次のスクリプトは、開発者がドキュメントのナビゲーション、ページ上のリソース、開発者スクリプトに関連したパフォーマンス指標を取得するために パフォーマンスタイムライン にアクセスする方法を示しています:

<!doctype html>
<html>
<head></head>
<body onload="init()">
  <img id="image0" src="https://www.w3.org/Icons/w3c_main.png" />
  <script>
    function init() {
      // see [[USER-TIMING-2]]
      performance.mark("startWork");
      doWork(); // 開発者コード
      performance.mark("endWork");
      measurePerf();
    }
    function measurePerf() {
      performance
        .getEntries()
        .map(entry => JSON.stringify(entry, null, 2))
        .forEach(json => console.log(json));
    }
  </script>
  </body>
</html>

また、開発者は パフォーマンスタイムライン を監視し、新しいパフォーマンス指標や、指定された型のバッファ済みパフォーマンス指標の通知を PerformanceObserver インターフェース経由で受け取ることもできます。

PerformanceObserver インターフェースは追加されており、最初の例で示したバッファベースの手法の制限に対応するために設計されています。PerformanceObserver インターフェースを使うことで、アプリケーションは以下を実現できます:

開発者は可能な限り PerformanceObserver の利用が推奨されます。さらに、新しいパフォーマンスAPIや指標は PerformanceObserver インターフェース経由でのみ利用可能な場合があります。オブザーバーは、コンストラクタでコールバックを指定し、observe() メソッドで興味のあるパフォーマンスエントリを指定することで動作します。 ユーザーエージェントがコールバックの実行タイミングを決定し、キューされたパフォーマンスエントリをコールバックで受け取ります。

PerformanceObserver インターフェースを使用する場合、初期ページロードに関する特別な考慮事項があります。イベントを受け取るには登録が有効でなければなりませんが、登録スクリプトが利用できない場合やクリティカルパスに含めたくない場合もあります。これに対応するため、ユーザーエージェントはページ構築中に一定数のイベントをバッファし、これらのバッファ済みイベントはオブザーバー登録時の buffered フラグを通じて取得できます。 このフラグを設定すると、ユーザーエージェントは指定されたエントリタイプのバッファ済みイベントを取得し、observe() 呼び出し後の最初のコールバックで配信します。

バッファされるイベント数は指標を定義する仕様によって決まり、バッファリングは最初のN件のみを対象としています。バッファは無制限または継続的ではありません。

<!doctype html>
<html>
<head></head>
<body>
<img id="image0" src="https://www.w3.org/Icons/w3c_main.png" />
<script>
// 利用したいエントリタイプがサポートされていない場合を検知する。
function detectSupport(entryTypes) {
  for (const entryType of entryTypes) {
    if (!PerformanceObserver.supportedEntryTypes.includes(entryType)) {
      // |entryType| がサポートされていないことをクライアントサイド解析に通知する。
    }
  }
}
detectSupport(["resource", "mark", "measure"]);
const userTimingObserver = new PerformanceObserver(list => {
  list
    .getEntries()
    // 必要な値を取得する
    .map(({ name, entryType, startTime, duration }) => {
      const obj = {
        "Duration": duration,
        "Entry Type": entryType,
        "Name": name,
        "Start Time": startTime,
      };
      return JSON.stringify(obj, null, 2);
    })
    // コンソールに表示する。
    .forEach(console.log);
  // イベント処理後に切断。
  userTimingObserver.disconnect();
});
// User-Timing の新しいイベントを購読。
userTimingObserver.observe({entryTypes: ["mark", "measure"]});
const resourceObserver = new PerformanceObserver(list => {
  list
    .getEntries()
    // 必要な値を取得する
    .map(({ name, startTime, fetchStart, responseStart, responseEnd }) => {
      const obj = {
        "Name": name,
        "Start Time": startTime,
        "Fetch Start": fetchStart,
        "Response Start": responseStart,
        "Response End": responseEnd,
      };
      return JSON.stringify(obj, null, 2);
    })
    // コンソールに表示する。
    .forEach(console.log);
  // イベント処理後に切断。
  resourceObserver.disconnect();
});
// バッファ済みイベントの取得と Resource Timing の新しいイベント購読。
resourceObserver.observe({type: "resource", buffered: true});
</script>
</body>
</html>

2. 適合性

非規範的と記載されているセクションだけでなく、この仕様に記載されたすべての著者向けガイドライン、図、例、および注記も非規範的です。それ以外のすべては規範的です。

この文書における MUSTMUST NOTSHOULD というキーワードは BCP 14 [RFC2119] [RFC8174] に記載された通りに解釈されます。 これらのキーワードがすべて大文字で記載されている場合のみ、ここで示すように解釈されます。

アルゴリズムや具体的な手順として表現された適合性要件は、最終的な結果が同等である限り、どのような方法で実装しても構いません。(特に、この仕様で定義されるアルゴリズムは理解しやすくするためのものであり、性能を重視したものではありません)。

3. パフォーマンスタイムライン

グローバルオブジェクト は以下を持ちます:

Document は以下を持ちます:

関連するパフォーマンスエントリタプルを取得するには、entryTypeglobalObject を入力として、次の手順を実行します:

  1. mapパフォーマンスエントリバッファマップglobalObjectに関連付けられているもの)とする。
  2. エントリの値を取得した結果を mapentryTypeキーとする)で返す。

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

これは [HR-TIME-3] の Performance インターフェースを拡張し、 パフォーマンスタイムラインからパフォーマンス指標データを取得するための属性やメソッドを提供します。

WebIDLpartial interface Performance {
  PerformanceEntryList getEntries ();
  PerformanceEntryList getEntriesByType (DOMString type);
  PerformanceEntryList getEntriesByName (DOMString name, optional DOMString type);
};
typedef sequence<PerformanceEntry> PerformanceEntryList;

PerformanceEntryListPerformanceEntry のシーケンスを表し、開発者にJavaScript配列で使える便利なメソッドを提供します。

3.1.1 getEntries() メソッド

filter buffer map by name and type アルゴリズムに nametypenull にして渡した結果の PerformanceEntryList オブジェクトを返します。

3.1.2 getEntriesByType() メソッド

namenulltype をメソッドの入力 type パラメータとして filter buffer map by name and type アルゴリズムに渡した結果の PerformanceEntryList オブジェクトを返します。

3.1.3 getEntriesByName() メソッド

name にメソッド入力の name パラメータ、type に optional entryType が省略された場合は null、そうでない場合はメソッド入力の type パラメータを設定し、 filter buffer map by name and type アルゴリズムに渡した結果の PerformanceEntryList オブジェクトを返します。

4. PerformanceEntry インターフェース

PerformanceEntry インターフェースは様々な指標のパフォーマンスデータを保持します。

WebIDL[Exposed=(Window,Worker)]
interface PerformanceEntry {
  readonly    attribute unsigned long long  id;
  readonly    attribute DOMString           name;
  readonly    attribute DOMString           entryType;
  readonly    attribute DOMHighResTimeStamp startTime;
  readonly    attribute DOMHighResTimeStamp duration;
  readonly    attribute unsigned long long  navigationId;
  [Default] object toJSON();
};
name
この属性は初期化時の値を返します。この PerformanceEntry オブジェクトの識別子を表します。この識別子は一意である必要はありません。
entryType
この属性は初期化時の値を返します。

すべての entryType の値は関連するレジストリで定義されています。 例:"mark""measure" [USER-TIMING-2]、"navigation" [NAVIGATION-TIMING-2]、 "resource" [RESOURCE-TIMING-2] など。

startTime
この属性は初期化時の値を返します。このパフォーマンス指標の最初に記録されたタイムスタンプの時刻値を表します。
duration
duration 属性のgetterの手順は、thisend time が 0 の場合は 0 を返し、そうでない場合は thisend time - thisstartTime を返します。
navigationId
この属性は初期化時の値を MUST 返します。

toJSON が呼び出されたときは、[WebIDL] の default toJSON steps を実行します。

PerformanceEntryDOMHighResTimeStamp 型の end time を持ち、初期値は 0 です。

PerformanceEntry を初期化するには entryDOMHighResTimeStamp startTimeDOMString entryTypeDOMString name、およびオプションの DOMHighResTimeStamp endTime(デフォルトは 0)を与え、以下の手順で行います:

  1. entryTypeentry type registry に定義されていることを確認する。
  2. entrystartTimestartTime で初期化する。
  3. entryentryTypeentryType で初期化する。
  4. entrynamename で初期化する。
  5. entryend timeendTime で初期化する。

5. PerformanceObserver インターフェース

PerformanceObserver インターフェースは パフォーマンスタイムライン を監視し、新しいパフォーマンス指標が記録された際や、バッファ済みのパフォーマンス指標があれば通知を受け取るために利用できます。

PerformanceObserver には以下の概念が関連付けられます:

PerformanceObserver(callback) コンストラクタは、新しい PerformanceObserver オブジェクトを生成し、その オブザーバーコールバックcallback に設定して返します。

登録済みパフォーマンスオブザーバー構造体 であり、 observer メンバー(PerformanceObserver オブジェクト)と options list メンバー( PerformanceObserverInit 辞書のリスト)で構成されます。

WebIDLcallback PerformanceObserverCallback = undefined (PerformanceObserverEntryList entries,
                                             PerformanceObserver observer,
                                             optional PerformanceObserverCallbackOptions options = {});
[Exposed=(Window,Worker)]
interface PerformanceObserver {
  constructor(PerformanceObserverCallback callback);
  undefined observe (optional PerformanceObserverInit options = {});
  undefined disconnect ();
  PerformanceEntryList takeRecords();
  [SameObject] static readonly attribute FrozenArray<DOMString> supportedEntryTypes;
};

パフォーマンスのオーバーヘッドを最小限に抑えるため、アプリケーションは必要なイベントタイプのみを購読し、パフォーマンスデータの監視が不要になったらオブザーバーを切断するべきです。名前によるフィルタリングはサポートされていません。これは全てのイベントタイプの購読を必要とし、可能ではあるものの推奨されません。大量のイベントが生成されるためです。

5.1 PerformanceObserverCallbackOptions 辞書

WebIDLdictionary PerformanceObserverCallbackOptions {
  unsigned long long droppedEntriesCount;
};
droppedEntriesCount
オブザーバーが監視しているエントリタイプのドロップされたエントリ数を表す整数値( PerformanceObserverrequires dropped entries が設定されている場合)。

5.2 observe() メソッド

observe() メソッドはユーザーエージェントにオブザーバー登録を指示し、以下の手順を実行します:

  1. relevantGlobalthis関連グローバルオブジェクトとする。
  2. optionsentryTypes および type の両方が省略された場合、throw "TypeError" を発生させる。
  3. optionsentryTypes が存在し、他のメンバーも存在する場合、throw "TypeError" を発生させる。
  4. thisobserver type を更新または確認するため、以下の手順を実行:
    1. thisobserver type"undefined" の場合:
      1. optionsentryTypes が存在する場合、thisobserver type"multiple" に設定する。
      2. optionstype が存在する場合、thisobserver type"single" に設定する。
    2. thisobserver type"single" かつ optionsentryTypes が存在する場合、throw "InvalidModificationError" を発生させる。
    3. thisobserver type"multiple" かつ optionstype が存在する場合、throw "InvalidModificationError" を発生させる。
  5. thisrequires dropped entries を true に設定する。
  6. thisobserver type"multiple" の場合、以下の手順を実行:
    1. entry typesoptionsentryTypes シーケンスとする。
    2. entry types から relevantGlobal対応エントリタイプの凍結配列 に含まれないタイプを全て除去する。ユーザーエージェントは推奨として、 entry types が変更された場合、開発者に通知するべきです。たとえば、除外されたタイプを列挙したコンソール警告などが適切です。
    3. 結果の entry types シーケンスが空であれば、これらの手順を中止する。ユーザーエージェントは手順が中止された際に登録が中止された旨を通知することが推奨されます。例としてコンソール警告など。
    4. relevantGlobal登録済みパフォーマンスオブザーバーオブジェクトのリスト登録済みパフォーマンスオブザーバー で、その observerthis であるものが含まれている場合、 その options listoptions だけを含むリストに置き換える。
    5. そうでなければ、登録済みパフォーマンスオブザーバー オブジェクトを作成し、relevantGlobal登録済みパフォーマンスオブザーバーオブジェクトのリスト に追加する。 observerthis とし、options listoptions だけを含むリストにする。
  7. それ以外の場合は以下の手順を実行:
    1. thisobserver type"single" であることを確認する。
    2. optionstyperelevantGlobal対応エントリタイプの凍結配列 に含まれていない場合、これらの手順を中止する。ユーザーエージェントはこの際に開発者へ通知することが推奨されます。例としてコンソール警告など。
    3. relevantGlobal登録済みパフォーマンスオブザーバーオブジェクトのリスト登録済みパフォーマンスオブザーバー obs で、その observerthis であるものが含まれている場合:
      1. obsoptions listPerformanceObserverInitcurrentOptions で、typeoptionstype と等しいものが含まれている場合、 obsoptions listcurrentOptionsoptions に置き換える。
      2. そうでなければ、optionsobsoptions list に追加する。
    4. そうでなければ、登録済みパフォーマンスオブザーバー オブジェクトを作成し、relevantGlobal登録済みパフォーマンスオブザーバーオブジェクトのリスト に追加する。 observerthis とし、options listoptions だけを含むリストにする。
    5. optionsbuffered フラグが設定されている場合:
      1. tuple関連パフォーマンスエントリタプルoptionstype および relevantGlobal)とする。
      2. tupleパフォーマンスエントリバッファ の各 entry について:

        1. should add entryentryoptions を渡して true を返す場合、appendentryオブザーバーバッファ に追加する。
      3. PerformanceObserver タスクのキューイングrelevantGlobal を入力)を行う。

PerformanceObserver オブジェクトは optionsentryTypes を設定して observe() を常に呼び出すか、または optionstype を設定して observe() を呼び出す必要があります。 1つの PerformanceObserverobserve()entryTypes で呼び出し、さらに type でも呼び出した場合、例外が発生します。これは呼び出しの重ね方による混乱を避けるためです。entryTypes を使う場合、他のパラメータは使えません。また、複数回の observe() 呼び出しは上書きされます(後方互換性・単一呼び出しで十分なため)。一方 type の場合は呼び出しが積み重なり、1回の呼び出しで1タイプのみ指定可能です。同じ type で呼び出した場合も上書きされます。

5.2.1 PerformanceObserverInit 辞書

WebIDLdictionary PerformanceObserverInit {
  sequence<DOMString> entryTypes;
  DOMString type;
  boolean buffered;
};
entryTypes
監視するエントリタイプのリスト。存在する場合、このリストは空であってはならず、他のメンバーは存在してはならない。ユーザーエージェントが認識しないタイプは無視しなければならない
type
監視対象の単一エントリタイプ。ユーザーエージェントが認識しないタイプは無視しなければならない。他のメンバーは同時に存在してもよい。
buffered
バッファされたエントリをオブザーバーバッファにキューイングするかどうかを示すフラグ。

5.2.2 PerformanceObserverEntryList インターフェース

WebIDL[Exposed=(Window,Worker)]
interface PerformanceObserverEntryList {
  PerformanceEntryList getEntries();
  PerformanceEntryList getEntriesByType (DOMString type);
  PerformanceEntryList getEntriesByName (DOMString name, optional DOMString type);
};

PerformanceObserverEntryList オブジェクトには entry list が関連付けられており、これは PerformanceEntryList で構成され、構築時に初期化されます。

5.2.2.1 getEntries() メソッド

filter buffer by name and type アルゴリズムに thisentry list と、nametypenull を渡した結果の PerformanceEntryList オブジェクトを返します。

5.2.2.2 getEntriesByType() メソッド

filter buffer by name and type アルゴリズムに thisentry list と、namenulltype にメソッド入力の type パラメータを渡した結果の PerformanceEntryList オブジェクトを返します。

5.2.2.3 getEntriesByName() メソッド

filter buffer by name and type アルゴリズムに thisentry list と、name にメソッド入力の name パラメータ、type に optional entryType を省略した場合は null、そうでない場合はメソッド入力の type パラメータを渡した結果の PerformanceEntryList オブジェクトを返します。

5.3 takeRecords() メソッド

takeRecords() メソッドは thisオブザーバーバッファ のコピーを返し、さらに thisオブザーバーバッファ を空にします。

5.4 disconnect() メソッド

disconnect() メソッドは以下を実行します:

  1. this登録済みパフォーマンスオブザーバーオブジェクトのリスト から削除する(関連グローバルオブジェクト)。
  2. thisオブザーバーバッファ を空にする。
  3. thisoptions list を空にする。

5.5 supportedEntryTypes 属性

グローバルオブジェクト には サポートされているエントリタイプの凍結配列 が関連付けられており、これは FrozenArray作成された、レジストリ内のグローバルオブジェクトに対応するサポート済み文字列をアルファベット順に並べたシーケンスから初期化されます。

supportedEntryTypes 属性のgetterが呼ばれたとき、次の手順を実行します:

  1. globalObject環境設定オブジェクトのグローバルオブジェクト とする。
  2. globalObjectサポートされているエントリタイプの凍結配列 を返す。

この属性により、ウェブ開発者はユーザーエージェントがサポートするエントリタイプを簡単に知ることができます。

6. 処理

6.1 PerformanceEntry のキューイング

PerformanceEntry をキューイングする (newEntry) には、以下の手順を実行します:

  1. newEntryid が未設定の場合:
    1. idIDの生成newEntry に対して実行した結果とする。
    2. newEntryidid に設定する。
  2. interested observers を最初は空の PerformanceObserver オブジェクト集合とする。
  3. entryTypenewEntryentryType 値とする。
  4. relevantGlobalnewEntry関連グローバルオブジェクト とする。
  5. relevantGlobal関連付けられたドキュメント を持つ場合:
    1. newEntrynavigationIdrelevantGlobal関連付けられたドキュメント最新ナビゲーションid の値に設定する。
  6. そうでなければ、newEntrynavigationId を null に設定する。
  7. relevantGlobal登録済みパフォーマンスオブザーバーオブジェクトのリスト の各 登録済みパフォーマンスオブザーバー regObs について:
    1. regObsoptions listPerformanceObserverInit options で、entryTypes メンバーに entryType が含まれるか、type メンバーが entryType と等しいものがあれば:

      1. should add entrynewEntryoptions を渡して true の場合、regObsobserverinterested observers に追加する。
  8. interested observers の各 observer について:
    1. newEntryobserverオブザーバーバッファ に追加する。
  9. tupleentryTyperelevantGlobal関連パフォーマンスエントリタプル とする。
  10. isBufferFullパフォーマンスエントリバッファが満杯かどうかの判定 アルゴリズムを tuple で実行した結果とする。
  11. shouldAddshould add entrynewEntry を渡した結果とする。
  12. isBufferFull が false かつ shouldAdd が true の場合、appendnewEntrytupleパフォーマンスエントリバッファ に追加する。
  13. PerformanceObserver タスクのキューイングrelevantGlobalを入力)を行う。

6.2 ナビゲーション PerformanceEntry のキューイング

ナビゲーション PerformanceEntry をキューイングする (newEntry) には、以下の手順を実行します:

  1. idIDの生成newEntry に対して実行した結果とする。
  2. relevantGlobalnewEntry関連グローバルオブジェクト とする。
  3. newEntryidid に設定する。
  4. newEntrynavigationIdid に設定する。
  5. relevantGlobal関連付けられたドキュメント を持つ場合:
    1. relevantGlobal関連付けられたドキュメント最新ナビゲーションnewEntry に設定する。
  6. PerformanceEntry のキューイングnewEntryを入力)を行う。

6.3 PerformanceObserver タスクのキューイング

PerformanceObserver タスクのキューイング では、relevantGlobal を入力として、以下の手順を実行します:

  1. relevantGlobalperformance observer タスクキュー済みフラグ が設定されている場合、これらの手順を終了する。
  2. relevantGlobalperformance observer タスクキュー済みフラグ を設定する。
  3. タスクをキューイングし、次のサブステップを実行する。 キューイングしたタスクの タスクソースパフォーマンスタイムラインタスクソース とする。
    1. relevantGlobalperformance observer タスクキュー済みフラグ を解除する。
    2. notifyListrelevantGlobal登録済みパフォーマンスオブザーバーオブジェクトのリスト のコピーとする。
    3. notifyList の各 登録済みパフォーマンスオブザーバー オブジェクト registeredObserver について、次の手順を実行する:
      1. poregisteredObserverobserver とする。
      2. entriespoオブザーバーバッファ のコピーとする。
      3. entries が空の場合、return。
      4. poオブザーバーバッファ を空にする。
      5. observerEntryList を新しい PerformanceObserverEntryList とし、 その entry listentries に設定する。
      6. droppedEntriesCount を null とする。
      7. porequires dropped entries が設定されていれば、以下の手順を実行する:
        1. droppedEntriesCount を 0 に設定する。
        2. registeredObserveroptions list の各 PerformanceObserverInit item について:
          1. itemtype または entryTypes に登場する各 DOMString entryType について:
            1. maprelevantGlobalパフォーマンスエントリバッファマップ とする。
            2. tuplemapentryType キーで 値の取得 をした結果とする。
            3. droppedEntriesCounttupleドロップ済みエントリ数 分増やす。
        3. porequires dropped entries を false に設定する。
      8. callbackOptionsPerformanceObserverCallbackOptions とし、 その droppedEntriesCountdroppedEntriesCount が null でなければその値、そうでなければ未設定とする。
      9. コールバック関数の呼び出しpoオブザーバーコールバック に « observerEntryList, po, callbackOptions »、"report"、po を渡す。

パフォーマンスタイムライン タスクキュー は低優先度のキューで、パフォーマンス監視コードの影響を最小限にするため、可能な限りアイドル期間に処理されるべきです。

6.4 バッファマップを名前と型でフィルタ

バッファマップを名前と型でフィルタ アルゴリズムを optional nametype で実行する場合、以下の手順を実行します:

  1. result を最初は空の リストとする。
  2. mapパフォーマンスエントリバッファマップ関連グローバルオブジェクトに関連付けられている)とする。
  3. tuple list を空の リストとする。
  4. type が null でなければ、maptype キーで エントリ値を取得した結果を tuple list に追加する。そうでなければ map値リスト取得結果を tuple list に代入する。
  5. tuple list の各 tuple について、以下の手順を実行する:
    1. buffertupleパフォーマンスエントリバッファ とする。
    2. tupleavailableFromTimeline が false なら、次の tuple へ進む。
    3. entriesバッファを名前と型でフィルタbuffernametype を渡して実行した結果とする。
    4. entries の各 entry について appendentryresult に追加する。
  6. results のエントリを startTime を基準に時系列順にソートする。
  7. result を返す。

6.5 バッファを名前と型でフィルタ

バッファを名前と型でフィルタ アルゴリズムを buffernametype で実行する場合、以下の手順を実行します:

  1. result を最初は空の リストとする。
  2. buffer の各 PerformanceEntry entry について、以下の手順を実行する:
    1. type が null でなく、かつ typeentryentryType 属性と 一致しない場合、次の entry へ進む。
    2. name が null でなく、かつ nameentryname 属性と 一致しない場合、次の entry へ進む。
    3. appendentryresult に追加する。
  3. results のエントリを startTime を基準に時系列順にソートする。
  4. result を返す。

6.6 パフォーマンスエントリバッファが満杯かどうかの判定

パフォーマンスエントリバッファが満杯かどうかの判定tuple を入力として、以下の手順を実行します:

  1. num current entriestupleパフォーマンスエントリバッファ のサイズとする。
  2. num current entriestuplesmaxBufferSize より小さければ false を返す。
  3. tupleドロップ済みエントリ数 を 1 増やす。
  4. true を返す。

6.7 Performance Entry の ID生成

IDの生成PerformanceEntry entry に対して実行する場合、以下の手順を実行します:

  1. relevantGlobalentry関連グローバルオブジェクト とする。
  2. relevantGloballast performance entry id をユーザーエージェントが選んだ少しの数値だけ増加させる。
  3. relevantGloballast performance entry id を返す。

ユーザーエージェントは last performance entry id を毎回少しの乱数で増加させてもよい。ユーザーエージェントは全グローバルオブジェクトの last performance entry id を同じ値でまとめて増やしてはならない(クロスオリジン漏洩の原因となるため)。

last performance entry id は初期値が乱数で、ユーザーエージェントが毎回1ではなく少しの数値で増加させることで、開発者がウェブアプリケーションで生成されたエントリ数のカウンタと誤認しないようにしています。

7. プライバシーに関する考慮事項

この仕様は [HR-TIME-3] で定義された Performance インターフェースを拡張し、パフォーマンスタイムライン からエントリをキューイング・取得するためのメソッドを提供します。高精度タイミング情報の公開に関するプライバシー考慮事項については [HR-TIME-3] を参照してください。新たにパフォーマンスエントリを導入する各仕様も、それぞれ独自のプライバシー考慮事項を持つべきです。

last performance entry id は意図的に乱数で初期化され、PerformanceEntry がキューイングされるたびにさらに小さな値で増加します。ユーザーエージェントはすべてのユーザーに対して一律の増加値を使うことも、各 グローバルオブジェクトごとに異なる増加値を選択することも、各 PerformanceEntry ごとに新たな乱数の増加値を選ぶことも可能です。ただし、クロスオリジン漏洩やフィンガープリンティングを防ぐため、ユーザーエージェントは単一のユニークな乱数を選んで全 PerformanceEntry オブジェクトを全 グローバルオブジェクトにわたって一貫して増加させてはなりません。

8. セキュリティに関する考慮事項

この仕様は [HR-TIME-3] で定義された Performance インターフェースを拡張し、パフォーマンスタイムライン からエントリをキューイング・取得するためのメソッドを提供します。高精度タイミング情報の公開に関するセキュリティ考慮事項については [HR-TIME-3] を参照してください。新たにパフォーマンスエントリを導入する各仕様も、それぞれ独自のセキュリティ考慮事項を持つべきです。

9. 依存関係

[INFRA] 仕様は次を定義します: キー付けエントリ値の取得

A. IDL インデックス

WebIDLpartial interface Performance {
  PerformanceEntryList getEntries ();
  PerformanceEntryList getEntriesByType (DOMString type);
  PerformanceEntryList getEntriesByName (DOMString name, optional DOMString type);
};
typedef sequence<PerformanceEntry> PerformanceEntryList;

[Exposed=(Window,Worker)]
interface PerformanceEntry {
  readonly    attribute unsigned long long  id;
  readonly    attribute DOMString           name;
  readonly    attribute DOMString           entryType;
  readonly    attribute DOMHighResTimeStamp startTime;
  readonly    attribute DOMHighResTimeStamp duration;
  readonly    attribute unsigned long long  navigationId;
  [Default] object toJSON();
};

callback PerformanceObserverCallback = undefined (PerformanceObserverEntryList entries,
                                             PerformanceObserver observer,
                                             optional PerformanceObserverCallbackOptions options = {});
[Exposed=(Window,Worker)]
interface PerformanceObserver {
  constructor(PerformanceObserverCallback callback);
  undefined observe (optional PerformanceObserverInit options = {});
  undefined disconnect ();
  PerformanceEntryList takeRecords();
  [SameObject] static readonly attribute FrozenArray<DOMString> supportedEntryTypes;
};

dictionary PerformanceObserverCallbackOptions {
  unsigned long long droppedEntriesCount;
};

dictionary PerformanceObserverInit {
  sequence<DOMString> entryTypes;
  DOMString type;
  boolean buffered;
};

[Exposed=(Window,Worker)]
interface PerformanceObserverEntryList {
  PerformanceEntryList getEntries();
  PerformanceEntryList getEntriesByType (DOMString type);
  PerformanceEntryList getEntriesByName (DOMString name, optional DOMString type);
};

B. 謝辞

この文書の作成にあたり、Arvind Jain、Boris Zbarsky、Jatinder Mann、Nat Duca、Philippe Le Hegaret、Ryosuke Niwa、Shubhie Panicker、Todd Reifsteck、Yoav Weiss、Zhiheng Wang の皆様の貢献に感謝します。

C. 参考文献

C.1 規範的参考文献

[dom]
DOM 現行標準. Anne van Kesteren. WHATWG. 現行標準. URL: https://dom.spec.whatwg.org/
[HR-TIME-3]
High Resolution Time. Yoav Weiss. W3C. 2024年11月7日. W3C作業草案. URL: https://www.w3.org/TR/hr-time-3/
[HTML]
HTML 現行標準. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Infra 現行標準. Anne van Kesteren; Domenic Denicola. WHATWG. 現行標準. URL: https://infra.spec.whatwg.org/
[RFC2119]
RFCsにおける必須要件語の使用方法. 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 現行標準. Edgar Chen; Timothy Gu. WHATWG. 現行標準. URL: https://webidl.spec.whatwg.org/

C.2 参考情報

[NAVIGATION-TIMING-2]
Navigation Timing Level 2. Yoav Weiss; Noam Rosenthal. W3C. 2025年2月13日. W3C作業草案. URL: https://www.w3.org/TR/navigation-timing-2/
[PERFORMANCE-TIMELINE]
Performance Timeline. Nicolas Pena Moreno. W3C. 2025年2月13日. CRD. URL: https://www.w3.org/TR/performance-timeline/
[RESOURCE-TIMING-2]
Resource Timing. Yoav Weiss; Noam Rosenthal. W3C. 2025年2月13日. CRD. URL: https://www.w3.org/TR/resource-timing/
[USER-TIMING-2]
User Timing Level 2. Ilya Grigorik. W3C. 2019年2月26日. W3C勧告. URL: https://www.w3.org/TR/user-timing-2/
[WORKERS]
Web Workers. Ian Hickson. W3C. 2021年1月28日. W3C作業グループノート. URL: https://www.w3.org/TR/workers/