写点什么

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:5112351
用户头像

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

关注

评论

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

向我看齐!京东智联云成 2020 TOP100 Summit“技术标兵”

京东科技开发者

DevOps 云原生 数字化

OLAP计算引擎怎么选?

数据社

OLAP 七日更

AWS云上安全最佳实践

雪雷

安全 AWS 云安全

快递员出售用户信息被判刑:如何防止快递行业信息泄露

石头IT视角

盘点 2020 | 鲜衣怒马少年时,不负韶华行且知!

程序员的时光

程序员 成长 编程之路 计算机 盘点2020

模糊匹配、相似度查询怎么破?看PG亿级检索毫秒响应

PostgreSQLChina

数据库 postgresql 开源

养猫了!

小林coding

生活

惊艳!阿里自爆用480页讲清楚了44种微服务架构设计模式

996小迁

程序员 面试 微服务 设计模式 架构设计

Gridea+GitHub搭建个人博客

Simon

GitHub Pages 博客 七日更

Spring 源码学习 09:refresh 大概流程

程序员小航

spring 源码 源码阅读

差点跳起来了!全靠这份“Java核心知识笔记”我成功拿到美团offer

比伯

Java 程序员 架构 计算机 编写

Polkadot系列(三)——如何实现共享安全性

QTech

区块链 polkadot 跨链

合成游戏app系统开发软件技术

提升awk技能的两个教程【译】

程序员架构进阶

Linux Shell awk

OTC场外交易系统开发软件定制

Windows安装MySQL5.7教程

Simon

MySQL windows 安装 七日更

成为分布式系统架构师,都要学哪些东西?该怎么学?

四猿外

Java 程序员 分布式 分布式系统 架构师

研发团队如何实现无缝协作?

万事ONES

研发管理 团队协作 研发效能 研发工具

数字货币交易所系统开发功能方案

突破程序员基本功的16课

田维常

程序员

我敢说这是全网最详细的基础讲解,附源码实例,没人学不明白

小Q

Java 学习 架构 面试 基础

一场由fork引发的超时,让我们重新探讨了Redis的抖动问题

华为云开发者联盟

redis fork 时延抖动

iOS面试基础知识 (四)

iOSer

ios 面试 底层知识

软件测试之登录测试详解

测试人生路

软件测试

dForce挖矿APP系统开发|dForce挖矿软件开发

系统开发

为什么现代系统需要一个新的编程模型?

华为云开发者联盟

编程 模型 语言

震闻:2021年 微服务 即将被这个取代了!!

Java架构师迁哥

四币连发交易所系统开发技术

堪称完美!阿里架构师用60个实战案例讲明白了Spring Boot

Java架构追梦

Java 架构 面试 微服务 springboot

波场链智能合约系统定制开发

合约跟单系统开发软件定制

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