【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

Web 性能 API——帮你分析 Web 前端性能

  • 2015-06-04
  • 本文字数:2816 字

    阅读完需:约 9 分钟

开发一个现代化的互联网网站是一项复杂的任务,需要各种职能的密切合作以应对用户日新月异的需求。其中,网页的性能直接决定了用户的体验,而随着新型客户端浏览设备的出现与网站功能的日益复杂化,对于性能的专注也达到了前所未有的高度。

传统的网站性能监测通常有以下几种方式:

  • 借助传统的开发者工具查看网络请求,例如浏览器的 F12 工具、 Fiddler Charles 等等。基本方式是通过追踪 HTTP 请求与响应的时间,以图形的方式列出所有资源的下载情况。这种方式依赖于人为操作,难以实现批量测试与统计。
  • 使用侵入式的 JavaScript 代码检测 DOM 事件的发生时间。例如 DOMContentLoaded 和 document.onreadystatechange 等等。这种方式会在页面中引入额外的代码,加重了开发者与测试人员的负担,还有可能因为检测代码本身的潜在问题影响页面的性能。
  • 使用第三方的服务与工具,例如 WebPagetest Pingdom 等等,这些服务通常能够实现在不同浏览器和不同地域进行测试,并且为用户提供一些优化建议。但某些服务需要排队等待,并且多次测试结果之间往往区别较大。第一条方式的问题也同样存在。

除此之外,以上各种方式的测量指标都比较单一,基本只能起到计时和流量计算的作用。对于其它一些指标,例如电池状态等无能为力。并且难以实现自动化,以及在持续集成流程中统计测试结果。

W3C Web 性能工作小组与各浏览器厂商都已认识到性能对于 web 开发的重要性,为了解决当前性能测试的困难,W3C 推出了一套性能API 标准,各种浏览器对这套标准的支持如今也逐渐成熟起来。这套API 的目的是简化开发者对网站性能进行精确分析与控制的过程,最终实现性能的提高。其中还包括了一些新协议与HTML 元素的提议,目的是让内容的展现更快、更加优化。

性能API 示例

整套标准包含了10 余种API,各自针对性能检测的某个方面。为了保证整套标准的质量与互操作性,W3C 按照惯例对它们应用了规范成熟度流程,这些API 各自处于流程的不同阶段。在下图中可以看到它们当前的进展:

以下将通过简单的示例介绍目前已属于W3C 推荐标准(REC)的三个API。

Navigation Timing (导航计时)

Navigation Timing API 能够帮助网站开发者检测真实用户数据(RUM),例如带宽、延迟或主页的整体页面加载时间。开发者可以用以下 JavaScript 代码检测页面的性能:

复制代码
varpage = performance.timing,
plt = page.loadEventStart - page.navigationStart,
console.log(plt);
// Page load time (PTL) output for specific browser/user in ms

需要注意的是,Navigation Timing 的目的是用于分析页面整体性能指标。如果要获取个别资源(例如 JS、图片)的性能指标,请使用 Resource Timing API。

W3C 刚刚宣布了 Navigation Timing 2 ,它将替代之前的版本。

High Resolution Timing(高精度计时)

该 API 规范所定义的 JavaScript 接口能够提供精确到微秒级的当前时间,并且不会受到系统时钟偏差或调整的影响。对于性能分析来说,精确的测量结果意义重大。

复制代码
varperf = performance.now();
// console output 439985.4570000316

Page Visibility (页面可见性)

通过这一规范,网站开发者能够以编程方式确定页面的当前可见状态,从而使网站能够更有效地利用电源与CPU。

当页面获得或失去焦点时,文档对象的 visibilitychange事件便会被触发。

复制代码
document.addEventListener('visibilitychange', function(event){if(document.hidden){// Page currently hidden.}else{// Page currently visible.}});

这一事件对于了解页面的可见状态十分有用,举例来说,用户可能会同时打开多个浏览器标签,而你希望只在用户显示你的网站页面时才进行某些操作(比如播放一段音频文件、或是执行一段 JavaScript 动画),就可以通过这一事件进行触发。对于移动设备来说,如果用户在某个标签中打开了你的网站,但正在另一个标签中浏览其它内容时,这一特性能够节省该设备的电池消耗。(虽然对于你的网站性能来说意义不大……)

其它部分 API 功能简介

  • Resource Timing (资源计时)——对单个资源(如图片)的计时,可以对细粒度的用户体验进行检测。
  • Performance Timeline (性能时间线)——以一个统一的接口获取由 Navigation Timing、Resourcing Timing 和 User Timing 所收集的性能数据。
  • Battery Status (电池状态)——能够检测当前设备的电池状态,例如是否正在充电、电量等级等等。可以根据当前电量决定是否显示某些内容(例如视频、动画等等),对于移动设备来说非常实用。
  • User Timing (用户计时)——可以对某段代码、函数进行自定义计时,以了解这段代码的具体运行时间,类似于 stop watch 的作用。
  • Beacon (灯塔)——可以将分析结果或诊断代码发送给服务器,它采用了异步执行的方式,因此不会影响页面中其它代码的运行。对于收集测试结果并进行统计分析来说是一种十分便利的工具。
  • Animation Timing (动画计时) - 通过 requestAnimationFrame 函数让浏览器精通地控制动画的帧数,能够有效地配合显示器的刷新率,提供更平滑的动画效果,减少对 CPU 和电池的消耗。
  • Resource Hits (资源提示) - 通过 html 属性指定资源的预加载,例如在浏览相册时能够预先加载下一张图片,加快翻页的显示速度。
  • Frame Timing (帧计时)——通过一个接口获取与帧相关的性能数据,例如每秒帧数和 TTF。该标准目前尚未被支持。
  • Navigation Error Logging (导航错误日志记录)——通过一个接口存储及获取与某个文档的导航相关的错误记录。该标准目前尚未被支持。

浏览器支持

下表列举了当前主流浏览器对性能 API 的支持,其中标注星号的内容并非来自于 Web 性能工作小组。

规范 Internet Explorer Firefox Chrome Safari Opera iOS Safari Android Navigation Timing 9 31 全部 8 26 8 (不包括 8.1) 4.1 High Resolution Timing 10 31 全部 8 26 8 (不包括 8.1) 4.4 Page Visibility 10 31 全部 7 26 7.1 4.4 Resource Timing 10 34 全部 - 26 - 4.4 Battery Status* - 31 (部分支持) 38 - 26 - - User Timing 10 - 全部 - 26 - 4.4 Beacon - 31 39 - 26 - - Animation Timing 10 31 全部 6.1 26 7.1 4.4 Resource Hints - - 仅限 Canary 版 - - - - Frame Timing - - - - - - - Navigation Error Logging - - - - - - - WebP* - - 全部 - 26 - 4.1 Picture element and srcset attribute * - - 38 - 26 - -其它

DZone.com 在《Performance & Monitoring 2015》这份白皮书中专门介绍了性能 API 以及 W3C 所推荐的新协议、标准及 HTML 元素,并提供了简单的示例。可以在这里下载完整的白皮书(需要注册)。本文中的示例代码即来自于该白皮书。

如果想了解有关Web 性能API 的更多内容,可以参考 W3C 官方文档或这篇博客


感谢徐川对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

2015-06-04 09:5112151
用户头像

发布了 428 篇内容, 共 172.2 次阅读, 收获喜欢 38 次。

关注

评论

发布
暂无评论
发现更多内容

IPQ5322 VS IPQ9574 What's the difference?

wallyslilly

ipq9574 ipq5322

2024杭州国际齿轮传动与减速机装备展览会

吹吹晚风

想开发一款带有视频通话/共享屏幕功能的产品?那WebRTC是你必须要知道的!

编程的平行世界

WebRTC

2024深圳国际电力自动化技术装备展览会

吹吹晚风

第49期|GPTSecurity周报

云起无垠

那些厉害的 Javaer 都在用什么?

秃头小帅oi

开发自己的游戏直播平台:需要一系列必要的条件和资料

软件开发-梦幻运营部

2024深圳国际风能技术装备展览会

吹吹晚风

2024深圳国际新能源与储能技术供应链展览会

吹吹晚风

几个容器网络问题实战解析

鲸品堂

容器 抓包分析

“星光不问赶路人,时光不负有心人”

开放签开源电子签章

电子合同 五一 电子签章

Databend 开源周报第 142 期

Databend

LED显示屏的节能效果

Dylan

娱乐 环保 LED显示屏 全彩LED显示屏 led显示屏厂家

电商新纪元:亚马逊国际商品详情API返回值的重要性

技术冰糖葫芦

API boy api 货币化 pinduoduo API

通义灵码实战系列:一个新项目如何快速启动,如何维护遗留系统代码库?

阿里云云效

阿里云 云原生 通义灵码

网站服务器在美国的优势与挑战分析

一只扑棱蛾子

服务器

您可知道如何通过`HTTP2`实现TCP的内网穿透???

不在线第一只蜗牛

网络协议 网络 HTTP

一次性讲明白,如何搞定一个可以支持多芯混合训练的 AI 集群

百度Geek说

企业号 4 月 PK 榜 AI集群

特斯拉全自动驾驶能力(FSD)或与百度合作;小红书内测自研大模型丨 RTE 开发者日报 Vol.196

声网

2024深圳国际智慧电厂技术设备及运维展览会

吹吹晚风

【JAVA】全链路灰度发布的实践分享

智在碧得

微服务架构 灰度发布 全链路 java 编程 全链路灰度

市场易入选「2023产业互联网示范平台」

Geek_2d6073

HashMap 原理分析

footmanff

hashmap HashMap底层原理 hashmap源码

通义灵码实战系列:一个新项目如何快速启动,如何维护遗留系统代码库?

阿里巴巴云原生

阿里云 云原生 通义灵码

中国少年,从一场软件竞技赛驶向产业之海

脑极体

软件

揭秘一个小本创业项目-互联网全媒体广告行业代理,利润超出你的认知!

互联网创业说

互联网全媒体广告投放,微信朋友圈广告全国招商加盟

Geek_dd3828

从原始边列表到邻接矩阵Python实现图数据处理的完整指南

EquatorCoco

数据库 图数据分析

2024杭州国际工业机械手展览会

吹吹晚风

免费送大家电子书了:全网独创

执于业务

软件测试学习笔记丨业务架构分析思路(业务架构分析)

测试人

软件测试

Web性能API——帮你分析Web前端性能_语言 & 开发_邵思华_InfoQ精选文章