Copyright © 2025 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
本规范定义了一个接口,供 web 应用程序访问文档中资源的完整计时信息。
本节描述了本文档发布时的状态。 W3C 当前的出版物列表以及本技术报告的最新修订版可以在 W3C 标准和草案索引(位于 https://www.w3.org/TR/)中找到。
本文档由 Web 性能工作组作为候选推荐标准草案发布, 采用推荐标准流程。
作为候选推荐标准发布并不意味着 W3C 及其成员的认可。候选推荐标准草案整合了先前候选推荐标准中的更改,工作组打算将其包含在后续的候选推荐标准快照中。
这是一份草案文件,可能随时被其他文件更新、替换或废弃。 将本文档作为正在进行的工作以外的任何形式引用都是不合适的。
本文档由一个在 W3C 专利政策下运作的小组制定。 W3C 维护着一份与其可交付成果相关的任何专利披露的 公开列表; 该页面还包括披露专利的说明。 任何实际知晓某项专利包含其认为的 必要权利要求的个人, 必须根据 W3C 专利政策第 6 节披露该信息。
本文档受 2023年11月3日 W3C 流程文档的约束。
本节是非规范性的。
用户延迟是 Web 应用程序的一个重要质量基准。虽然基于 JavaScript 的机制可以为应用程序内的用户延迟测量提供全面的工具,但在许多情况下,它们无法提供完整的端到端延迟信息。本文档引入了 PerformanceResourceTiming
接口,使 JavaScript
机制能够收集与文档中资源相关的完整计时信息。导航计时 2 [NAVIGATION-TIMING-2]
扩展了本规范,以提供与导航相关的附加计时信息。
例如,以下 JavaScript 展示了一个简单的尝试,来测量获取资源所花费的时间:
<!doctype html>
<html>
<head>
</head>
<body onload="loadResources()">
<script>
function loadResources()
{
var start = new Date().getTime();
var image1 = new Image();
var resourceTiming = function() {
var now = new Date().getTime();
var latency = now - start;
alert("End to end resource fetch: " + latency);
};
image1.onload = resourceTiming;
image1.src = 'https://www.w3.org/Icons/w3c_main.png';
}
</script>
<img src="https://www.w3.org/Icons/w3c_home.png">
</body>
</html>
尽管此脚本可以测量获取资源所花费的时间,但它无法细分各个阶段所花费的时间。此外,该脚本无法轻松测量标记中描述的资源的获取时间。
为了解决对用户体验的完整信息的需求,本文档引入了 PerformanceResourceTiming
接口。此接口允许
JavaScript 机制在应用程序中提供完整的客户端延迟测量。使用此接口,可以修改上面的示例来测量用户感知的资源加载时间。
下面的脚本计算页面中每个资源的获取时间,即使是标记中定义的资源。此示例假设该页面托管在 https://www.w3.org。还可以进一步测量获取资源的每个阶段所花费的时间,使用 PerformanceResourceTiming
接口。
<!doctype html>
<html>
<head>
</head>
<body onload="loadResources()">
<script>
function loadResources()
{
var image1 = new Image();
image1.onload = resourceTiming;
image1.src = 'https://www.w3.org/Icons/w3c_main.png';
}
function resourceTiming()
{
var resourceList = window.performance.getEntriesByType("resource");
for (i = 0; i < resourceList.length; i++)
{
if (resourceList[i].initiatorType == "img")
{
alert("End to end resource fetch: " + (resourceList[i].responseEnd - resourceList[i].startTime));
}
}
}
</script>
<img id="image0" src="https://www.w3.org/Icons/w3c_home.png">
</body>
</html>
除了标记为非规范性的部分外,本规范中的所有编写指南、图表、示例和注释均为非规范性的。本规范中的其他内容都是规范性的。
本文档中的关键词 MAY、MUST 和 SHOULD 应按照 BCP 14 [RFC2119] [RFC8174] 中的描述进行解释, 当且仅当它们以全大写形式出现时,如此处所示。
算法中的命令性需求(例如“去掉所有前导空格字符”或“返回 false 并中止这些步骤”)应按照引入算法时使用的关键字(如“MUST”、"SHOULD"、"MAY"等)的含义来解释。
某些一致性要求以属性、方法或对象为要求,这些要求应解释为对用户代理的要求。
以算法或具体步骤表述的一些一致性要求可以通过任何方式实现,只要最终结果等效即可。(特别是,本规范中定义的算法旨在易于理解,而非旨在高效运行。)
表述 “一个 Foo
对象”,其中 Foo
实际上是一个接口,有时会用来代替更准确的说法 “一个实现了接口 Foo
的对象”。
在本规范中,所有的时间值都是自文档导航开始以来的毫秒数 [HR-TIME]。例如,文档导航的开始 发生在时间 0。
此时间定义基于高分辨率时间规范 [HR-TIME],与导航计时规范 [NAVIGATION-TIMING-2] 使用的时间定义不同,后者的时间是自1970年1月1日午夜(UTC)以来的毫秒数。
本节是非规范性的。
PerformanceResourceTiming
接口有助于对获取的 http(s)
资源进行计时测量。例如,此接口可用于
XMLHttpRequest
对象 [XHR]、HTML 元素 [HTML](例如
iframe
、
img
、
script
、
object
、
embed
和链接类型为
stylesheet
的
link
)、SVG
元素 [SVG11]
(例如 svg)以及
EventSource
。
PerformanceResourceTiming
接口中包含的资源
本节是非规范性的。
由非 null 客户端获取的资源请求会作为 PerformanceResourceTiming
对象包含在客户端的全局对象的性能时间轴中,除非在获取过程中被排除在时间轴之外。从 HTTP 缓存中检索的资源会作为 PerformanceResourceTiming
对象包含在性能时间轴中。已启动获取但稍后中止(例如由于网络错误)的资源会作为PerformanceResourceTiming
对象包含在性能时间轴中,并带有其开始和结束计时。
示例:
IMG
元素的 src
属性,则由第一个 HTML IMG
元素启动的资源的获取将作为 PerformanceResourceTiming
对象包含在性能时间轴中。用户代理可能不会为第二个
HTML IMG
元素重新请求该 URL,而是使用它为第一个 HTML IMG
元素启动的现有下载。在这种情况下,第一个
IMG
元素对资源的获取将是性能时间轴中的唯一一次出现。
IMG
元素的 src
属性,则原始资源的获取以及新 URL 的获取都将作为
PerformanceResourceTiming
对象包含在性能时间轴中。
IFRAME
元素而未指定 src
属性,则用户代理可能会为该
IFRAME
加载 about:blank
文档。如果稍后通过脚本动态更改 src
属性,则用户代理可能会为该 IFRAME
获取新的 URL 资源。在这种情况下,只有新 URL 的获取才会作为
PerformanceResourceTiming
对象包含在性能时间轴中。
XMLHttpRequest
,则资源的两次获取都将作为
PerformanceResourceTiming
对象包含在性能时间轴中。这是因为第二个
XMLHttpRequest
对资源的获取无法重用为第一个 XMLHttpRequest
发出的下载。
IFRAME
元素,则只有由 IFRAME
src
属性请求的资源才会作为
PerformanceResourceTiming
对象包含在性能时间轴中。由
IFRAME
文档请求的子资源将包含在 IFRAME
文档的性能时间轴中,而不是父文档的性能时间轴中。
IMG
元素的源是
data: URI
[RFC2397],则此资源不会作为 PerformanceResourceTiming
对象包含在性能时间轴中。PerformanceResourceTiming
条目仅针对
http(s) 资源报告。
PerformanceResourceTiming
对象包含在性能时间轴中,并且仅设置
startTime
、fetchStart
、duration
和
responseEnd
。
PerformanceResourceTiming
对象包含在性能时间轴中。
WebIDL[Exposed=(Window,Worker)]
interface PerformanceResourceTiming
: PerformanceEntry {
readonly attribute DOMString initiatorType
;
readonly attribute DOMString deliveryType
;
readonly attribute ByteString nextHopProtocol
;
readonly attribute DOMHighResTimeStamp workerStart
;
readonly attribute DOMHighResTimeStamp redirectStart
;
readonly attribute DOMHighResTimeStamp redirectEnd
;
readonly attribute DOMHighResTimeStamp fetchStart
;
readonly attribute DOMHighResTimeStamp domainLookupStart
;
readonly attribute DOMHighResTimeStamp domainLookupEnd
;
readonly attribute DOMHighResTimeStamp connectStart
;
readonly attribute DOMHighResTimeStamp connectEnd
;
readonly attribute DOMHighResTimeStamp secureConnectionStart
;
readonly attribute DOMHighResTimeStamp requestStart
;
readonly attribute DOMHighResTimeStamp finalResponseHeadersStart
;
readonly attribute DOMHighResTimeStamp firstInterimResponseStart
;
readonly attribute DOMHighResTimeStamp responseStart
;
readonly attribute DOMHighResTimeStamp responseEnd
;
readonly attribute unsigned long long transferSize
;
readonly attribute unsigned long long encodedBodySize
;
readonly attribute unsigned long long decodedBodySize
;
readonly attribute unsigned short responseStatus
;
readonly attribute RenderBlockingStatusType
renderBlockingStatus
;
readonly attribute DOMString contentType
;
readonly attribute DOMString contentEncoding
;
[Default] object toJSON
();
};
一个 PerformanceResourceTiming
具有一个关联的
DOMString
发起者类型。
一个 PerformanceResourceTiming
具有一个关联的
DOMString
交付类型。
一个 PerformanceResourceTiming
具有一个关联的
DOMString
请求的 URL。
一个 PerformanceResourceTiming
具有一个关联的
DOMString
缓存模式
(空字符串、“local
”或“validated
”)。
一个 PerformanceResourceTiming
有一个关联的 获取计时信息 计时信息。
一个 PerformanceResourceTiming
有一个关联的 响应体信息 资源信息。
一个 PerformanceResourceTiming
具有一个关联的
状态
响应状态。
一个 PerformanceResourceTiming
具有一个关联的
RenderBlockingStatusType
渲染阻塞状态。
当调用 toJSON
时,为 PerformanceResourceTiming
运行默认 toJSON 步骤。
initiatorType
getter 步骤是为 this 返回发起者类型。
initiatorType
返回以下值之一:
"navigation"
,如果请求是导航请求;
"css"
,如果请求是处理 CSS url() 指令(例如
@import
url()
或 background: url()
)的结果;[CSS-VALUES]
"script"
,如果请求是加载任何脚本(经典的
script
、
模块脚本或
Worker
)的结果。
"xmlhttprequest"
,如果请求是处理 XMLHttpRequest
的结果;
"fetch"
,如果请求是处理 fetch
()
方法的结果;
"beacon"
,如果请求是处理 sendBeacon
()
方法的结果;[BEACON]
"video"
,如果请求是处理
video
元素的
poster
或
src
的结果。
"audio"
,如果请求是处理
audio
元素的
src
的结果。
"track"
,如果请求是处理
track
元素的
src
的结果。
"img"
,如果请求是处理
img
元素的
src
或
srcset
的结果。
"image"
,如果请求是处理 image
元素的结果。[SVG2]
"input"
,如果请求是处理
type
为
image
的
input
元素的结果。
"a"
,如果请求是处理
a
元素的
download
或
ping
的结果。
"iframe"
,如果请求是处理
iframe
的
src
的结果。
"frame"
,如果请求是加载
frame
的结果。
"other"
,如果以上条件均不匹配。
initiatorType
的设置是在报告资源计时条目的不同位置完成的,例如 fetch 标准。
deliveryType
getter 步骤是为 this 返回交付类型。
deliveryType
返回以下值之一:
"cache"
,如果缓存模式不是空字符串。
""
,如果不匹配上述任何条件。
预计未来的规范更新将扩展此内容,例如描述如何消费预加载资源和预取导航请求。
workerStart
getter 步骤是为 this 的 计时信息的 最终 service
worker 启动时间和 this 的相关全局对象转换获取时间戳。更多信息请参见 HTTP 获取。
redirectStart
getter 步骤是为 this 的 计时信息的 重定向开始时间和 this 的相关全局对象转换获取时间戳。更多信息请参见 HTTP 重定向获取。
redirectEnd
getter 步骤是为 this 的 计时信息的 重定向结束时间和 this 的相关全局对象转换获取时间戳。更多信息请参见 HTTP 重定向获取。
fetchStart
getter 步骤是为 this 的 计时信息的 重定向后开始时间和 this 的相关全局对象转换获取时间戳。更多信息请参见 HTTP 获取。
domainLookupStart
getter 步骤是为 this 的 计时信息的 最终连接计时信息的
域名查找开始时间和
this 的相关全局对象转换获取时间戳。更多信息请参见记录连接计时信息。
domainLookupEnd
getter 步骤是为 this 的 计时信息的 最终连接计时信息的
域名查找结束时间和 this 的相关全局对象转换获取时间戳。更多信息请参见记录连接计时信息。
connectStart
getter 步骤是为 this 的 计时信息的 最终连接计时信息的
连接开始时间和 this 的相关全局对象转换获取时间戳。更多信息请参见记录连接计时信息。
connectEnd
getter 步骤是为 this 的 计时信息的 最终连接计时信息的
连接结束时间和 this 的相关全局对象转换获取时间戳。更多信息请参见记录连接计时信息。
secureConnectionStart
getter 步骤是为 this 的 计时信息的 最终连接计时信息的
安全连接开始时间和
this 的相关全局对象转换获取时间戳。更多信息请参见记录连接计时信息。
nextHopProtocol
getter 步骤是同构解码
this 的 计时信息的
最终连接计时信息的
ALPN
协商协议。更多信息请参见记录连接计时信息。
问题 221 建议移除对 nextHopProtocol 的支持,因为它可能会泄露用户网络配置的详细信息。
requestStart
getter 步骤是为 this 的 计时信息的 最终网络请求开始时间和
this 的相关全局对象转换获取时间戳。更多信息请参见 HTTP 获取。
firstInterimResponseStart
getter 步骤是为 this 的 计时信息的 第一个临时网络响应开始时间和
this 的相关全局对象转换获取时间戳。更多信息请参见 HTTP 获取。
finalResponseHeadersStart
getter 步骤是为 this 的 计时信息的 最终网络响应开始时间和
this 的相关全局对象转换获取时间戳。更多信息请参见 HTTP 获取。
responseStart
getter 步骤是返回 this 的
firstInterimResponseStart
(如果不为
0);否则返回 this 的
finalResponseHeadersStart
。
responseEnd
getter 步骤是为 this 的 计时信息的 结束时间和 this 的相关全局对象转换获取时间戳。更多信息请参见
获取。
encodedBodySize
getter 步骤是返回
this 的 资源信息的 编码大小。
decodedBodySize
getter 步骤是返回
this 的 资源信息的 解码大小。
transferSize
getter 的步骤是:
添加到 transferSize
的常量数字取代了公开 HTTP 标头的总字节大小,因为这可能会暴露某些 cookie 的存在。请参见此问题。
responseStatus
getter 步骤是返回
this 的 响应状态。
contentType
getter 步骤是返回 this 的
资源信息的
内容类型。
contentEncoding
getter 的步骤是返回
此对象的资源信息的内容编码。
renderBlockingStatus
getter 步骤是如果 this 的 计时信息的 渲染阻塞为 true,则返回 blocking
;否则返回
non-blocking
。
实现 PerformanceResourceTiming
的用户代理需要在
supportedEntryTypes
中包含 "resource"
。这允许开发人员检测对资源计时的支持。
WebIDLenum RenderBlockingStatusType
{
"blocking
",
"non-blocking
"
};
这些值的定义如下:
blocking
non-blocking
用户代理 可以 限制多少资源作为
PerformanceResourceTiming
对象包含在
性能时间线 中 [PERFORMANCE-TIMELINE-2]。此部分扩展了
Performance
接口,以允许控制存储的
PerformanceResourceTiming
对象的数量。
推荐的 PerformanceResourceTiming
对象的最小数量是 250,尽管此数量可能会由用户代理更改。
可以调用
setResourceTimingBufferSize
来请求更改此限制。
每个 ECMAScript 全局环境 都有:
PerformanceResourceTiming
对象。
WebIDLpartial interface Performance
{
undefined clearResourceTimings
();
undefined setResourceTimingBufferSize
(unsigned long maxSize);
attribute EventHandler onresourcetimingbufferfull
;
};
Performance
接口定义在
[HR-TIME]
中。
clearResourceTimings
方法运行以下步骤:
PerformanceResourceTiming
对象在
性能条目缓冲区
中的所有实例。
setResourceTimingBufferSize
方法运行以下步骤:
PerformanceResourceTiming
对象。
onresourcetimingbufferfull
是
resourcetimingbufferfull
事件的事件处理程序,描述如下。
要检查 是否可以添加资源计时条目,请执行以下步骤:
要 添加 PerformanceResourceTiming 条目 new entry 到 性能条目缓冲区 中,请执行以下步骤:
要 复制次要缓冲区,请执行以下步骤:
PerformanceResourceTiming
在 资源计时次要缓冲区 中。
要 触发缓冲区已满事件,请执行以下步骤:
Performance
对象上触发一个名为
resourcetimingbufferfull
的事件。
这意味着,如果 resourcetimingbufferfull
事件处理程序没有比它向缓冲区添加的资源腾出更多空间,
则多余的条目将从缓冲区中丢弃。开发者应该确保
resourcetimingbufferfull
事件处理程序调用
clearResourceTimings
或足够扩展缓冲区(通过调用
setResourceTimingBufferSize
)。
正如 Fetch
中详述的,跨域资源的请求作为 PerformanceResourceTiming
对象包含在性能时间轴中。如果跨域资源的计时允许检查算法失败,则该条目将是一个不透明条目。此类条目的大部分属性都会被屏蔽,以防止泄露未公开的跨域数据。因此,对于一个不透明条目,以下属性将被设置为零:
redirectStart
、
redirectEnd
、
workerStart
、
domainLookupStart
、
domainLookupEnd
、
connectStart
、
connectEnd
、
requestStart
、
firstInterimResponseStart
、
finalResponseHeadersStart
、
responseStart
、
secureConnectionStart
、
transferSize
、
encodedBodySize
和
decodedBodySize
。
此外,
nextHopProtocol
属性将被设置为空字符串。
服务器端应用程序可以返回 Timing-Allow-Origin HTTP 响应头,以允许用户代理完全向指定的文档源公开那些由于跨域限制而设置为零的属性值。
Timing-Allow-Origin HTTP 响应头字段可用于传达一个策略,该策略指示哪些源可以查看由于跨域限制而本应为零的属性值。该标头的值由以下 ABNF [RFC5234] 表示(使用列表扩展,[RFC9110]):
Timing-Allow-Origin = 1#( origin-or-null / wildcard )
发送方 可以 生成多个 Timing-Allow-Origin 头字段。接收方 可以 通过将每个后续字段值按顺序附加到组合字段值来组合多个 Timing-Allow-Origin 头字段,使用逗号分隔。
用户代理 可以 仍然执行跨域限制并将 transferSize、encodedBodySize 和 decodedBodySize 属性设置为零,即使存在 Timing-Allow-Origin HTTP 响应头字段。如果这样做,它 可以 还将 deliveryType 设置为空字符串 ""。
Timing-Allow-Origin 头字段在 FETCH 中处理以相应地计算属性。
Timing-Allow-Origin 头字段可能作为缓存响应的一部分到达。在缓存重新验证的情况下,根据 RFC 7234, 该头字段的值可能来自重新验证响应,或者如果那里没有出现,则来自原始缓存的资源。
本节将 Timing-Allow-Origin 注册为 临时消息头。
Timing-Allow-Origin
Timing-Allow-Origin
响应头
本节是非规范性的。
下图说明了 PerformanceResourceTiming 接口定义的计时属性。在获取跨域资源时,括号中的属性可能不可用。用户代理可能会在计时之间执行内部处理,这允许计时之间存在非规范性间隔。
PerformanceResourceTiming
接口定义的计时属性。括号中的属性表示如果资源未通过
时间允许检查 算法,它们可能不可用。
要标记资源计时,给定一个 获取计时信息 timingInfo、一个 DOMString requestedURL、一个 DOMString initiatorType、一个全局对象 global、一个字符串 cacheMode、一个 响应体信息 bodyInfo、一个 状态 responseStatus 以及一个可选的字符串 deliveryType(默认为空字符串),请执行以下步骤:
PerformanceResourceTiming
对象
entry。
要为 PerformanceResourceTiming
entry 设置资源计时条目,给定 DOMString
initiatorType、DOMString requestedURL、获取计时信息
timingInfo、一个 DOMString cacheMode、一个 响应体信息
bodyInfo、一个 状态
responseStatus 以及一个可选的 DOMString deliveryType(默认为空字符串),请执行以下步骤:
local
" 或 "validated
"。
resource
"、requestedURL 以及转换 timingInfo
的结束时间(给定
global)的结果。
cache
"。
要转换获取时间戳,给定 DOMHighResTimeStamp
ts 和全局对象
global,请执行以下操作:
本节为非规范性内容。
PerformanceResourceTiming
接口向已请求该资源的任何网页或 worker 公开该资源的计时信息。为了限制对 PerformanceResourceTiming
接口的访问,默认情况下会强制执行同源策略,并且某些属性会设置为零,如 HTTP
获取中所述。资源提供者可以通过添加 Timing-Allow-Origin HTTP
响应头来明确允许收集资源的所有计时信息,该响应头指定了允许访问计时信息的域。
本节为非规范性内容。
统计指纹识别是一个隐私问题,恶意网站可以通过测量第三方网站中资源的缓存命中和未命中的时间来确定用户是否访问过该第三方网站。尽管 PerformanceResourceTiming
接口提供了文档中资源的计时信息,但资源的加载事件已经可以有限地测量计时以确定缓存命中和未命中,并且 HTTP 获取中的跨域限制阻止了任何其他信息的泄漏。
感谢 Anne Van Kesteren、Annie Sullivan、Arvind Jain、Boris Zbarsky、Darin Fisher、Jason Weber、Jonas Sicking、James Simonsen、 Karen Anderson、Kyle Scholz、Nic Jansma、Philippe Le Hegaret、Sigbjørn Vik、Steve Souders、Todd Reifsteck、Tony Gentilcore、 William Chan 和 Alex Christensen 对这项工作的贡献。
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:
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: