Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
この仕様は、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 によって管理されます。
この節は非規範的です。
ウェブ開発者には、アプリケーションのパフォーマンス特性を評価し、理解する能力が必要です。
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,
});
});
});
非規範的と明示された節に加え、この仕様におけるすべての作成者向けガイドライン、図、例、および注記は 非規範的です。この仕様のそれ以外のすべては規範的です。
この文書におけるキーワード MAY および MUST は、 ここに示すようにすべて 大文字で現れる場合に限り、 BCP 14 [RFC2119] [RFC8174] に記述されているように解釈されます。
一部の適合要件は、属性、 メソッド、またはオブジェクトに対する要件として表現されています。そのような要件は、 ユーザーエージェントに対する要件として解釈されます。
この仕様の IDL 断片は、Web IDL 仕様で説明される適合する IDL 断片に必要なものとして解釈されなければなりません。 [WEBIDL]
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);
};
関連付けられた名前を持つタイムスタンプ(「マーク」)を格納します。これは次の 手順を実行しなければなりません。
detailstartTime関連付けられた名前を持つ格納済みタイムスタンプを削除します。これは次の 手順を実行しなければなりません。
PerformanceMark
オブジェクトを パフォーマンス
エントリーバッファーから削除します。PerformanceMark
オブジェクトのうち、
name が markName であるものをすべて削除します。
2 つのマーク間の DOMHighResTimeStamp
期間を、関連付けられた名前(「メジャー」)とともに格納します。これは次の手順を実行しなければなりません。
PerformanceMeasureOptions
オブジェクトであり、start、end、duration、および detail の少なくとも 1 つが 存在する場合、次の
チェックを実行します。
PerformanceMeasureOptions
オブジェクトであり、その end メンバーが 存在する場合、
end time を、startOrMeasureOptions の end を渡して マークをタイムスタンプに変換する
アルゴリズムを実行して返される値とします。
PerformanceMeasureOptions
オブジェクトであり、その start および duration
メンバーがどちらも 存在する場合:
start
を渡して マークを
タイムスタンプに変換するアルゴリズムを実行して返される値とします。
duration
を渡して マークを
タイムスタンプに変換するアルゴリズムを実行して返される値とします。
Performance オブジェクトの now()
メソッドによって返される値とします。
PerformanceMeasureOptions
オブジェクトであり、その start メンバーが 存在する場合、
start time を、startOrMeasureOptions の start を渡して マークをタイムスタンプに変換する
アルゴリズムを実行して返される値とします。
PerformanceMeasureOptions
オブジェクトであり、その duration および
end メンバーがどちらも
存在する場合:
duration
を渡して マークを
タイムスタンプに変換するアルゴリズムを実行して返される値とします。
end を渡して
マークを
タイムスタンプに変換するアルゴリズムを実行して返される値とします。
DOMString である場合、
start time を、startOrMeasureOptions を渡して マークをタイムスタンプに変換する
アルゴリズムを実行して返される値とします。
0 とします。PerformanceMeasure オブジェクト
(entry)を作成します。name 属性を measureName に設定します。entryType 属性を DOMString "measure" に設定します。
startTime 属性を start time に設定します。duration 属性を start
time から end time までの期間に設定します。結果の期間値は負であってもかまいません。
detail 属性を次のように設定します。
PerformanceMeasureOptions
オブジェクトであり、startOrMeasureOptions の detail メンバーが
存在する場合:
detail
に対して StructuredSerialize
アルゴリズムを呼び出した結果とします。
detail を、
record および 現在の
Realmに対して StructuredDeserialize
アルゴリズムを呼び出した結果に設定します。
null に設定します。detailstartdurationend関連付けられた名前を持つ格納済みタイムスタンプを削除します。これは次の手順を実行しなければなりません。
PerformanceMeasure オブジェクトを削除します。PerformanceMeasure オブジェクトのうち、
name が measureName であるものをすべて削除します。
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 属性は、値 0 の DOMHighResTimeStamp
を返さなければなりません。
PerformanceMark インターフェイスには、次の
追加属性があります。
detail
属性は設定された値を返さなければなりません(これは PerformanceMarkOptions 辞書からコピーされます)。
PerformanceMark コンストラクター
PerformanceMark コンストラクターは、次の 手順を実行しなければなりません。
Window オブジェクトであり、markName が
PerformanceTiming
インターフェイスの 読み取り専用属性と同じ名前を
使用している場合、SyntaxError をスローします。
PerformanceMark オブジェクト
(entry)を作成します。
name 属性を markName に設定します。entryType 属性を DOMString "mark" に設定します。startTime 属性を次のように設定します。
duration 属性を 0 に設定します。detail が null の場合、
entry の detail を
null に設定します。
detail に対して StructuredSerialize
アルゴリズムを呼び出した結果とします。detail を、
record および 現在の
Realmに対して StructuredDeserialize
アルゴリズムを呼び出した結果に設定します。
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
辞書からコピーされます)。
User Timing API を実装するユーザーエージェントは、"mark" および
"measure" を
supportedEntryTypes に含める必要があります。これにより、開発者は User Timing のサポートを検出できます。
DOMString または DOMHighResTimeStamp
である mark が与えられたとき、マークをタイムスタンプに変換するには、次の手順を実行します。
DOMString であり、
PerformanceTiming
インターフェイスの 読み取り専用属性と同じ名前を持つ場合、
end time を、name を mark の値に設定して 名前をタイムスタンプに変換するアルゴリズムを
実行して返される値とします。
DOMString である場合、end time を、
パフォーマンス
エントリーバッファー内の PerformanceMark オブジェクトのうち、
name が mark であるものの最新の出現から取得した
startTime 属性の値とします。一致するエントリーが
見つからない場合、SyntaxError をスローします。
DOMHighResTimeStamp
である場合:
TypeError
をスローします。
PerformanceTiming
インターフェイスの 読み取り専用
属性である name が与えられたとき、
名前を
タイムスタンプに変換するには、
次の手順を実行します。
Window オブジェクトでない場合、TypeError をスローします。navigationStart の場合、0 を返します。PerformanceTiming
インターフェイス内の navigationStart の値とします。
PerformanceTiming
インターフェイス内の name の値とします。
0 の場合、InvalidAccessError
をスローします。
PerformanceTiming インターフェイスは [NAVIGATION-TIMING] で定義され、 現在では廃止されたものと見なされています。PerformanceTiming インターフェイスの名前の使用は後方互換性を維持するためにサポートされていますが、将来、 この機能を [NAVIGATION-TIMING-2] で定義される PerformanceNavigationTiming インターフェイス(またはその他のインターフェイス)の名前へ拡張する予定はありません。
開発者には、一般的なタイミングを マークするために次の推奨マーク名を使用することが推奨されます。ユーザー エージェントは、これらの名前の使用が 適切であるか、またはその説明と整合しているかを検証しません。
このような推奨マーク名を追加すると、パフォーマンス ツールがサイトに合わせてガイダンスを調整するのに役立ちます。これらのマーク名は、 リアルユーザーモニタリングプロバイダーやユーザーエージェントが、 大規模にアプリケーションのパフォーマンスに関するウェブ開発者のシグナルを収集し、 サイト固有の作業を必要とせずにこの情報を 開発者へ提示するのにも役立ちます。
この例では、ページは読み込み時にチャットウィジェット、 検索ボックス、ニュースフィードを非同期に初期化します。完了すると、 「mark_fully_loaded」マーク名により、ラボツール および分析 プロバイダーがタイミングを自動的に表示できるようになります。
window.addEventListener("load", (event) => {
Promise.all([
loadChatWidget(),
initializeSearchAutocomplete(),
initializeNewsfeed()]).then(() => {
performance.mark('mark_fully_loaded');
});
});
detail
メタデータには、その機能に関する有用な情報を含めることができ、次のものを含みます。
この例では、FancyJavaScriptFramework の ImageOptimizationComponent を使用して、最適なパフォーマンスになるよう画像のサイズを設定します。コードは この機能の使用を記録し、ラボツールおよび分析が、 パフォーマンス改善に役立ったかどうかを測定できるようにします。
performance.mark('mark_feature_usage', {
'detail': {
'feature': 'ImageOptimizationComponent',
'framework': 'FancyJavaScriptFramework'
}
})
この節は非規範的です。
この仕様で定義されるインターフェイスは、ページ上の特定の JavaScript 活動に関する、 潜在的に機密性の高いタイミング情報を公開します。 高解像度タイミング情報を公開することに関するプライバシーおよびセキュリティ上の考慮事項については、 [HR-TIME-2] を参照してください。
ウェブプラットフォームは、ページに含まれるどのスクリプトも、 それぞれのスクリプトのオリジンに関係なく、 同じページに含まれる他のどのスクリプトとも同じアクセス権を持つという不変条件に基づいて 設計されているため、この仕様で定義される インターフェイスは、記録されたタイミング情報の 記録または取得にいかなる制限も設けません。すなわち、ページに含まれる任意のスクリプトによって記録された ユーザータイミングのマークまたはメジャーは、オリジンに関係なく、 同じページ上で実行されている他の任意のスクリプトから読み取ることができます。
この作業への貢献について、 James Simonsen、 Jason Weber、 Nic Jansma、 Philippe Le Hegaret、 Karen Anderson、 Steve Souders、 Sigbjorn Vik、 Todd Reifsteck、および Tony Gentilcore に感謝します。
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: