performance.now() 更准因其基于页面加载起点的单调递增高精度时间戳(微秒级),不受系统时钟调整影响,适合性能测量;而 Date.now() 依赖易变的系统时钟。

performance.now() 为什么比 Date.now() 更准
它返回的是高精度时间戳(单位毫秒,精确到微秒级),基于页面加载起点(navigationStart)而非系统时钟,不受系统时间调整、NTP 同步或时区切换影响。适合测量函数执行耗时、动画帧间隔、资源加载细分阶段等。
-
performance.now()是单调递增的,不会倒退 - 在 Web Worker 中也可用,且与主线程时钟同步
- 注意:不能直接用于计算“当前时间”,因为它不表示 Unix 时间戳
const start = performance.now();
doSomeHeavyWork();
const end = performance.now();
console.log(`耗时: ${end - start} ms`);如何用 performance.getEntriesByType('navigation') 看首屏关键指标
它返回 PerformanceNavigationTiming 对象数组(通常只有 1 个),包含从重定向、DNS 查询、TCP 连接、SSL 握手、请求发送、响应接收,到 DOM 解析、DOMContentLoaded、load 等完整生命周期数据。
-
entry.loadEventEnd - entry.loadEventStart是 load 事件本身耗时(常被忽略) -
entry.domContentLoadedEventEnd - entry.fetchStart反映白屏到首屏可交互的时间 -
entry.responseEnd - entry.requestStart是真实后端响应耗时(含网络)
const navEntries = performance.getEntriesByType('navigation');
if (navEntries.length > 0) {
const entry = navEntries[0];
console.log('FCP 估算:', entry.domContentLoadedEventStart - entry.fetchStart);
}performance.mark() 和 performance.measure() 怎么配合打点分析
这是最轻量、最可控的自定义性能标记方式,适合圈定某段业务逻辑(如 React 组件挂载、第三方 SDK 初始化)的实际耗时,且能跨异步边界(setTimeout、Promise.then、事件回调中均可读取)。
- 标记名(
mark第一个参数)必须是字符串,重复调用会覆盖前一个同名标记 -
measure的起止参数可以是标记名、PerformanceEntry对象,或省略(自动用最近的两个标记) - 所有标记和测量结果都可通过
performance.getEntries()或按类型过滤获取
performance.mark('api-start');
fetch('/api/data').then(() => {
performance.mark('api-end');
performance.measure('api-duration', 'api-start', 'api-end');
});
// 后续可查:performance.getEntriesByName('api-duration')为什么 performance.memory 在 Chrome 里经常是 undefined
它属于 MemoryInfo 接口,Chrome 从 92 版本起默认禁用该 API(需开启 --enable-precise-memory-info 启动参数),且仅在 HTTPS 页面、无跨域 iframe、未启用隐私模式下才可能返回有效值。Firefox 和 Safari 完全不支持。
立即学习“Java免费学习笔记(深入)”;
- 不要依赖
performance.memory.totalJSHeapSize做线上内存监控 - 真要测内存泄漏,应结合 Chrome DevTools 的 Memory 面板 + heap snapshot 对比
- 服务端渲染或 SSR 场景下,该字段始终不可用
真正稳定可用的内存相关指标,目前只有 performance.getEntriesByType('resource') 中每个资源的 transferSize 和 encodedBodySize —— 它们反映实际网络传输体积,比压缩后文件大小更真实。











