请检查 勘误表,了解发布后报告的错误或问题。
另见 翻译。
Copyright © 2019 W3C® (MIT, ERCIM, Keio, Beihang). W3C liability, trademark and permissive document license rules apply.
本规范定义了一个接口,帮助 Web 开发人员通过提供高精度时间戳来衡量其应用程序的性能。
本节描述了本文档在发布时的状态。其他文档可能会取代此文档。当前 W3C 出版物的列表及此技术报告的最新修订版可在 W3C 技术报告索引上找到:https://www.w3.org/TR/。
用户计时第 2 级旨在取代第 1 版 [USER-TIMING],并包括:
PerformanceMark
和 PerformanceMeasure
[WORKERS];
PerformanceTiming
接口的标记名称的澄清。
本文档由 Web 性能工作组 作为建议标准发布。
GitHub 问题 是讨论此规范的首选方式。
或者,您可以将评论发送到我们的邮件列表。
请发送至
public-web-perf@w3.org
(存档)
并在电子邮件主题的开头添加 [UserTiming]
。
请参阅工作组的 实现报告。
本文档已经经过 W3C 成员、软件开发人员以及其他 W3C 小组和相关方的审查,并已得到 W3C 总监的认可为 W3C 推荐标准。它是一个稳定的文档,可以用作参考资料或被其他文档引用。 W3C 在制定推荐标准时的作用是引起对该规范的关注并推动其广泛部署。这提高了 Web 的功能性和互操作性。
本文档由一个根据 W3C 专利政策 运营的小组制作。 W3C 维护了一个 公开的专利披露列表,该列表列出了与小组交付物相关的任何专利披露;该页面还包括披露专利的说明。任何了解包含 必要声明 的专利的个人必须根据 W3C 专利政策第 6 节 披露信息。
本文档受 2018 年 2 月 1 日 W3C 过程文档 管理。
本节为非规范性内容。
Web 开发者需要评估和理解其应用程序的性能特征。尽管 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]
定义了两种用于检索记录的计量机制:getEntries()
和 getEntriesByType()
方法,以及
PerformanceObserver
接口。前者适用于在单个时间点按名称检索特定指标的情况,而后者针对希望在新指标可用时接收通知的情况进行了优化。
除了标记为非规范性的部分,本规范中的所有作者指南、图表、示例和注释均为非规范性内容。 本规范中的其他所有内容都是规范性的。
关键字 MAY 和 MUST 应按照 [RFC2119] 中的说明进行解释。
一些符合性要求以对属性、方法或对象的要求形式表达。这些要求应解释为对用户代理的要求。
本规范中的IDL片段必须按照Web IDL规范中所述的方式解释为符合性IDL片段。 [WEBIDL]
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()
方法存储带有相关名称("mark")的时间戳。它 必须 按照以下步骤运行:
Window
对象,并且 markName 使用的名称与
PerformanceTiming
接口中的某个 只读属性 相同,
抛出 一个
SyntaxError
。
PerformanceMark
对象(entry)。name
属性设置为 markName。entryType
属性设置为 DOMString "mark"
。startTime
属性设置为通过 Performance
对象的
now()
方法返回的值。
duration
属性设置为 0
。clearMarks()
方法删除带有相关名称的已存储时间戳。它 必须 按照以下步骤运行:
PerformanceMark
对象中删除所有条目,并从
性能条目缓冲区中删除。
PerformanceMark
对象,其名称与 markName 匹配,并列在
性能条目缓冲区
中。
measure()
方法存储两个标记之间的 DOMHighResTimeStamp
持续时间以及相关的名称(“measure”)。它
必须 按照以下步骤运行:
0
。Performance
对象的
now()
方法返回的值。否则:
PerformanceTiming
接口中的某个只读属性 相同,使用
endMark 的值运行 将名称转换为时间戳 算法,并将 name 设置为
endMark。
PerformanceMark
对象的 startTime
属性中,
其名称与 endMark 的值匹配的最近一次出现的条目。如果未找到匹配的条目,
抛出 一个
SyntaxError
。
0
。否则:
PerformanceTiming
接口中的某个只读属性 相同,使用
startMark 的值运行 将名称转换为时间戳 算法,并将 name 设置为
startMark。
PerformanceMark
对象的 startTime
属性中,
其名称与 startMark 的值匹配的最近一次出现的条目。如果未找到匹配的条目,
抛出 一个
SyntaxError
。
PerformanceMeasure
对象(entry)。name
属性设置为 measureName。entryType
属性设置为 DOMString "measure"
。startTime
属性设置为 start time。duration
属性设置为从 start time 到 end time
的持续时间。所得的持续时间值 可以 为负值。clearMeasures()
方法删除带有相关名称的已存储时间戳。它 必须 按照以下步骤运行:
PerformanceMeasure
对象中删除所有条目,并从
性能条目缓冲区中删除。
PerformanceMeasure
对象,其名称与 measureName
匹配,并列在
性能条目缓冲区
中。
PerformanceMark
接口PerformanceMark
接口还通过
performance.mark
方法将创建的标记暴露给
性能时间轴。
[Exposed=(Window,Worker)]
interface PerformanceMark
: PerformanceEntry {
};
PerformanceMark
接口扩展了
PerformanceEntry
接口的以下属性:
name
属性必须返回标记的名称。
entryType
属性必须返回 DOMString
"mark"
。
startTime
属性必须返回带有标记时间值的 DOMHighResTimeStamp
。
duration
属性必须返回值为 0
的 DOMHighResTimeStamp
。
PerformanceMeasure
接口PerformanceMeasure
接口还通过
performance.measure
方法将创建的测量暴露给
性能时间轴。
[Exposed=(Window,Worker)]
interface PerformanceMeasure
: PerformanceEntry {
};
PerformanceMeasure
接口扩展了
PerformanceEntry
接口的以下属性:
name
属性必须返回测量的名称。
entryType
属性必须返回 DOMString
"measure"
。
startTime
属性必须返回带有测量起始标记的 DOMHighResTimeStamp
。
duration
属性必须返回测量的持续时间的 DOMHighResTimeStamp
。
实现用户计时API的用户代理必须执行以下步骤:
要在给定 name 的情况下,将 name 转换为 时间戳,如果该名称是
PerformanceTiming
接口中的一个 只读属性,请执行以下步骤:
Window
对象,抛出 一个
SyntaxError
。
navigationStart
,返回 0
。PerformanceTiming
接口中的 navigationStart
的值。
PerformanceTiming
接口中的 name 的值。
0
,抛出
一个 InvalidAccessError
。
PerformanceTiming 接口定义在 [NAVIGATION-TIMING] 中,并且现在被认为是过时的。 PerformanceTiming 接口中的名称仍然支持以保持向后兼容性, 但没有计划将此功能扩展到 [NAVIGATION-TIMING-2] 定义的 PerformanceNavigationTiming 接口(或其他接口)中的名称。
本节为非规范性。
本规范中定义的接口暴露了页面上特定JavaScript活动的潜在敏感计时信息。 有关暴露高分辨率计时信息的隐私和安全考虑,请参阅 [HR-TIME-2]。
由于Web平台的设计原则是,页面上包含的任何脚本与同一页面上包含的任何其他脚本拥有相同的访问权限, 无论这些脚本的来源如何,本规范定义的接口不对记录或检索已记录的计时信息施加任何限制 - 即页面上包含的任何脚本记录的用户计时标记或测量可以被同一页面上运行的任何其他脚本读取,无论其来源如何。
感谢以下人员对本工作的贡献: James Simonsen, Jason Weber, Nic Jansma, Philippe Le Hegaret, Karen Anderson, Steve Souders, Sigbjorn Vik, Todd Reifsteck, Tony Gentilcore。