公開後に報告されたエラーや問題については、 正誤表をご確認ください。
また、 翻訳も参照してください。
Copyright © 2019 W3C® (MIT, ERCIM, Keio, Beihang). W3C liability, trademark and permissive document license rules apply.
この仕様は、ウェブ開発者が高精度タイムスタンプへのアクセスによってアプリケーションのパフォーマンスを計測できるようにするインターフェイスを定義します。
このセクションは公開時点の文書のステータスを示します。他の文書が本書を置き換える場合があります。現行のW3C出版物と本技術レポートの最新改訂は、W3C技術レポート索引 https://www.w3.org/TR/ でご確認いただけます。
User Timing レベル2は、[USER-TIMING] の第1版を置き換えることを意図しており、以下を含みます:
PerformanceMark
と PerformanceMeasure
のサポート;
PerformanceTiming
インターフェイス参照名のための mark 名の処理明確化。
本書は Webパフォーマンス作業グループ によって 勧告として公開されました。
この仕様の議論には GitHub Issues の利用が推奨されています。
または、メーリングリストにコメントを送ることもできます。
送信先は
public-web-perf@w3.org
(アーカイブ)
件名の最初に [UserTiming]
を記載してください
。
作業グループの 実装報告もご覧ください。
本書は W3C 会員、ソフトウェア開発者、他の W3C グループおよび関係者によってレビューされ、ディレクターにより W3C 勧告として承認されました。これは安定した文書であり、参考資料や他の文書から引用することができます。W3C の勧告化は仕様の周知と普及促進を目的としており、Webの機能性と相互運用性を高めます。
本書は W3C 特許ポリシー の下で運営されるグループにより作成されています。 W3Cは 関連する特許開示の公開リスト を管理しています。 このページには特許開示の方法も記載されています。ある人が特許の存在を知り、その内容が 必須クレーム を含むと考える場合は、 W3C特許ポリシー第6節 に従って情報を開示する必要があります。
この文書は 2018年2月1日 W3Cプロセス文書に準拠します。
このセクションは規範的ではありません。
ウェブ開発者は、自身のアプリケーションのパフォーマンス特性を評価・理解する機能を必要としています。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
インターフェイスです。前者は特定のメトリックを名前で単一のタイミングで取得したい場合に最適であり、後者は新しいメトリックが利用可能になった際に通知を受け取りたい場合に最適化されています。
規範的でないと明記されているセクションだけでなく、この仕様書に含まれるすべての作成ガイドライン、図、例、注記も規範的ではありません。 それ以外の内容はすべて規範的です。
MAY および MUST というキーワードは [RFC2119] で説明されている通りに解釈されます。
一部の適合性要件は属性、メソッド、またはオブジェクトに対する要件として記述されています。これらの要件は、ユーザーエージェントに対する要件として解釈されます。
本仕様書のIDL断片は、Web IDL仕様書 [WEBIDL] で説明されている通り、適合するIDL断片には MUST として解釈されます。
Performance
インターフェイスへの拡張
Performance
インターフェイスは
[HR-TIME-2] で定義されています。
partial interface Performance
{
void mark
(DOMString markName);
void clearMarks
(optional DOMString markName);
void measure
(DOMString measureName, optional DOMString startMark, optional DOMString endMark);
void clearMeasures
(optional DOMString measureName);
};
mark()
メソッド関連付けられた名前(「マーク」)と共にタイムスタンプを保存します。以下の手順を MUST で実行します:
Window
オブジェクトで、markName が
PerformanceTiming
インターフェイスの read only attribute
と同じ名前の場合、throw SyntaxError
を投げます。
PerformanceMark
オブジェクト(entry)を作成します。name
属性に markName を設定します。entryType
属性に DOMString "mark"
を設定します。startTime
属性に Performance
オブジェクトの now()
メソッドが返す値を設定します。duration
属性に 0
を設定します。clearMarks()
メソッド関連付けられた名前のタイムスタンプを削除します。以下の手順を MUST で実行します:
PerformanceMark
オブジェクトを performance
entry buffer からすべて削除します。PerformanceMark
オブジェクトで name が
markName に一致するものを performance
entry buffer からすべて削除します。
measure()
メソッド2つのマーク間の DOMHighResTimeStamp
の duration を、関連付けられた名前(「メジャー」)と共に保存します。以下の手順を MUST で実行します:
0
とする。Performance
オブジェクトの now()
メソッドの値を設定する。そうでなければ:
PerformanceTiming
インターフェイスの read only
attribute と同じ名前の場合、convert a name to a timestamp アルゴリズムに
name を endMark として渡した値を end time に設定する。
PerformanceMark
オブジェクトのうち name
が
endMark に一致するものの最新の startTime
属性の値を end time
に設定する。該当エントリがなければ、throw SyntaxError
を投げる。
0
とする。そうでなければ:
PerformanceTiming
インターフェイスの read only
attribute と同じ名前の場合、convert a name to a timestamp アルゴリズムに
name を startMark として渡した値を start time に設定する。
PerformanceMark
オブジェクトのうち name
が
startMark に一致するものの最新の startTime
属性の値を start time
に設定する。該当エントリがなければ、throw SyntaxError
を投げる。
PerformanceMeasure
オブジェクト(entry)を作成する。name
属性に measureName を設定する。entryType
属性に DOMString "measure"
を設定する。startTime
属性に start time を設定する。duration
属性に start time から end time
までの継続時間を設定する。結果の duration 値は MAY マイナス値であっても良い。clearMeasures()
メソッド関連付けられた名前のタイムスタンプを削除します。以下の手順を MUST で実行します:
PerformanceMeasure
オブジェクトを performance
entry buffer からすべて削除する。
PerformanceMeasure
オブジェクトで name
が
measureName に一致するものを performance
entry buffer からすべて削除する。
PerformanceMark
インターフェイスPerformanceMark
インターフェイスは、performance.mark
メソッドで作成されたマークも Performance
Timeline へ公開します。
[Exposed=(Window,Worker)]
interface PerformanceMark
: PerformanceEntry {
};
PerformanceMark
インターフェイスは、PerformanceEntry
インターフェイスの下記属性を拡張します:
name
属性はマーク名を返します。
entryType
属性は DOMString
の
"mark"
を返します。
startTime
属性は、そのマークの時刻値を持つ DOMHighResTimeStamp
を返します。
duration
属性は値 0
の DOMHighResTimeStamp
を返します。
PerformanceMeasure
インターフェイスPerformanceMeasure
インターフェイスは、performance.measure
メソッドで作成されたメジャーも Performance Timeline
へ公開します。
[Exposed=(Window,Worker)]
interface PerformanceMeasure
: PerformanceEntry {
};
PerformanceMeasure
インターフェイスは、PerformanceEntry
インターフェイスの下記属性を拡張します:
name
属性はメジャー名を返します。
entryType
属性は DOMString
の
"measure"
を返します。
startTime
属性は、メジャーの開始マークを持つ DOMHighResTimeStamp
を返します。
duration
属性はメジャーの継続時間を持つ DOMHighResTimeStamp
を返します。
User Timing APIを実装するユーザーエージェントは、以下の手順を実行しなければなりません:
"mark"
を指定して実行する。"measure"
を指定して実行する。timestampへのnameの変換を、nameが
PerformanceTiming
インターフェイスのread only attributeである場合、以下の手順を実行します:
Window
オブジェクトでない場合、throw SyntaxError
を投げる。navigationStart
なら0
を返す。PerformanceTiming
インターフェイスのnavigationStart
の値とする。
PerformanceTiming
インターフェイスのnameの値とする。
0
の場合、throw
InvalidAccessError
を投げる。
PerformanceTiming インターフェイスは [NAVIGATION-TIMING] で定義されましたが、現在は廃止扱いです。 PerformanceTimingインターフェイスの名前の利用は後方互換性のためにサポートされていますが、今後PerformanceNavigationTimingインターフェイス([NAVIGATION-TIMING-2]で定義)や他インターフェイスでこの機能を拡張する計画はありません。
このセクションは規範的ではありません。
この仕様で定義されるインターフェイスは、ページの特定JavaScriptアクティビティについて機微なタイミング情報を公開します。 高精度タイミング情報の公開に関するプライバシーとセキュリティの考慮事項については [HR-TIME-2] を参照してください。
ウェブプラットフォームは、ページに含まれる任意のスクリプトが、そのページに含まれる他のスクリプトと同じアクセス権を持つという不変性のもと設計されています。したがって、この仕様で定義されるインターフェイスは、タイミング情報の記録・取得に関して制限を設けていません。すなわち、ページ上の任意のスクリプトで記録されたユーザータイミングのマークやメジャーは、同じページ上で動作する他の任意のスクリプトから(オリジンに関係なく)取得可能です。
James Simonsen、 Jason Weber、 Nic Jansma、 Philippe Le Hegaret、 Karen Anderson、 Steve Souders、 Sigbjorn Vik、 Todd Reifsteck、 Tony Gentilcore 各氏に本仕様への貢献を感謝します。