PerformanceEntry 是浏览器性能数据的核心载体,为真实可读、可筛选的实例,由浏览器自动记录或开发者打点生成,统一含 name、entryType、startTime、duration 四字段,但语义依 entryType 而异;其子类如 PerformanceNavigationTiming、PerformanceResourceTiming 等对应不同性能场景,可通过 getEntries()、getEntriesByType() 等方法获取,并受默认150条缓冲区限制。

PerformanceEntry 是浏览器性能数据的核心载体,不是抽象概念,而是真实可读、可筛选、可导出的性能条目实例。它不直接创建,而是由浏览器自动记录或开发者主动打点生成,所有条目统一遵循 name、entryType、startTime、duration 四个基础字段,但具体含义和附加属性取决于 entryType 类型。
PerformanceEntry 的类型与典型用途
它本身是抽象基类,实际出现的都是其子类实例,每种类型对应一类性能场景:
- PerformanceNavigationTiming:页面导航全过程,如 reload、back_forward、prerender 等,提供 navigationStart、domContentLoadedEventEnd、loadEventEnd 等关键时间点
- PerformanceResourceTiming:每个资源(script、img、css、fetch)的加载细节,含 connectStart、responseEnd、transferSize、encodedBodySize 等网络与传输指标
- PerformanceMark:开发者手动标记的时间点,如 performance.mark('ui-start'),用于自定义阶段划分
- PerformanceMeasure:基于两个 mark 计算出的耗时区间,如 performance.measure('render-time', 'ui-start', 'ui-end')
- PerformancePaintTiming:首屏渲染关键节点,包括 first-paint、first-contentful-paint(FCP)
如何获取和筛选 PerformanceEntry 数据
浏览器默认维护一个性能时间线(performance timeline),可通过以下方式提取:
- performance.getEntries():返回全部条目,按 startTime 升序排列,包含 navigation、resource、mark、paint 等混合类型
- performance.getEntriesByType(type):按 entryType 精确筛选,例如 getEntriesByType('resource') 只返回资源加载数据
- performance.getEntriesByName(name, type?):按 name 字段匹配,支持模糊查找,常用于定位特定脚本或自定义 mark
- PerformanceObserver:推荐用于长期监控,可监听新条目实时进入时间线,避免轮询开销
关键字段解析与常见误读
看似简单的四个基础字段,在不同 entryType 下语义差异很大,容易误用:
- startTime:对 navigation 来说是 navigationStart 时间戳;对 resource 是 fetchStart;对 mark 是打点时刻;对 paint 是渲染发生时刻——它不是统一“开始”,而是该事件的锚点时间
- duration:navigation 类型中 duration ≈ loadEventEnd − navigationStart;resource 类型中 duration ≈ responseEnd − fetchStart;而 mark 的 duration 恒为 0
- name:navigation 类型中是文档 URL;resource 类型中通常是请求 URL;mark/measurement 中是开发者传入的字符串标识
- entryType:决定对象结构,也影响后续分析逻辑。比如想查 DNS 耗时,必须选 PerformanceResourceTiming 实例,再读 domainLookupEnd − domainLookupStart
资源条目限制与内存管理
浏览器默认只保留最近 150 个 PerformanceEntry,超出后旧条目会被丢弃。这对长期运行的 SPA 或监控 SDK 构成风险:
- setResourceTimingBufferSize(n):可增大资源类条目的缓存上限,例如 setResourceTimingBufferSize(500)
- clearResourceTimings():清空当前已记录的所有 resource 条目,适合在页面切换或重试前重置
- performance.clearMarks()/clearMeasures():分别清理 mark 和 measure 条目,避免污染后续测量
- 注意:这些清理操作只影响 JavaScript 可访问的数据,不影响 DevTools 中已录制的 Performance 面板数据











