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

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. 適合性

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

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

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

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

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

各 Document は以下を持ちます:

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

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

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;

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

3.1.1 getEntries() メソッド

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

3.1.2 getEntriesByType() メソッド

name を null、type をメソッドの入力 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の手順は、this の end time が 0 の場合は 0 を返し、そうでない場合は this の end time - this の startTime を返します。
navigationId
この属性は初期化時の値を MUST 返します。

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

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

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

  1. entryType が entry type registry に定義されていることを確認する。
  2. entry の startTime を startTime で初期化する。
  3. entry の entryType を entryType で初期化する。
  4. entry の name を name で初期化する。
  5. entry の end time を endTime で初期化する。

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
オブザーバーが監視しているエントリタイプのドロップされたエントリ数を表す整数値( PerformanceObserver の requires dropped entries が設定されている場合)。

5.2 observe() メソッド

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

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

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

1 つの PerformanceObserver オブジェクトは、 常に observe() を呼び出す際に、 options の entryTypes を設定するか、または 常に observe() を呼び出す際に、 options の type を設定する必要があります。 1 つの PerformanceObserver が、 仮に observe() を、entryTypes 付きで呼び出し、さらに observe を、 type 付きで呼び出した場合、例外が スローされます。これは、呼び出しがどのように累積されるかについての混乱を避けるためです。 entryTypes を使用する場合、ほかの パラメーターは、PerformanceObserverInit では使用できません。 さらに、 複数回の observe() 呼び出しは上書きされます。これは、 後方互換性のため であり、またこの場合は 1 回の呼び出しで十分なためです。 一方、type を使用する場合、呼び出しは 1 回の呼び出しでは 1 つの型しか指定できないため、累積されます。 observe() を、同じ 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 アルゴリズムに this の entry list と、name、type に null を渡した結果の PerformanceEntryList オブジェクトを返します。

5.2.2.2 getEntriesByType() メソッド

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

5.2.2.3 getEntriesByName() メソッド

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

5.3 takeRecords() メソッド

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

5.4 disconnect() メソッド

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

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

5.5 supportedEntryTypes 属性

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

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

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

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

6. 処理

6.1 PerformanceEntry のキューイング

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

6.7 Performance Entry の ID生成

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

  1. relevantGlobal を entry の 関連グローバルオブジェクト とする。
  2. relevantGlobal の last performance entry id をユーザーエージェントが選んだ少しの数値だけ増加させる。
  3. relevantGlobal の last 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/