如何衡量前端产品性能?

按指标衡量

完...

衡量前端产品性能有多个指标,我们解读一下chrome开发工具为我们提供的指标:

1. Chrome Dev Tools

Network标签

访问爱奇艺首页:

Screen Shot 2020-05-06 at 9.18.01 PM.png

421 requests - 网络请求数
15.1 MB transferred - 数据传输量(压缩)
18.2 MB resources - 数据原始大小
Finish 3.91 s - 最后请求完成时间
DOMContentLoaded: 758ms - DOM完全加载及解析事件触发时间
Load: 3.83 s - 页面加载完成触发时间

虽然有几百个请求,但页面加载只用了4秒不到的时间,代表着非常豪华的硬件网络,赤裸裸地透露着有钱人的气质。

以上几个指标理解起来都不难, 我们看看在具体的某一个请求中有哪些信息可以参考。选中任意行并将鼠标移到waterfall

Screen Shot 2020-05-06 at 9.23.32 PM.png

Queued at - 请求入队列时间
Started at 4.67 ms - 请求开始时间,注意,开始并不代表请求发送

Resource Scheduling
Queueing 4.67 ms - 入队耗时

Connection Start
Stalled 0.62 ms - 请求被挂起,会有多种原因,比如要是缓存命中的话,请求就不会被发送了
DNS Lookup 8.65 ms - DNS解析耗时
Initial connection 45.22 ms - 初次连接耗时
SSL 45.22 ms - SSL 耗时

Request/Response
Request sent 0.37 ms - 请求发送耗时
Waiting (TTFB)0.44 ms - Time to First Byte 首字节耗时
Content Download - 资源下载时间

Performance标签

Google 还提出了一些以用户为中心的指标 - user centric metrics,优秀的企业就是会搞事情。

让我们从Network切换到Performance标签,再访问爱奇艺首页:


Screen Shot 2020-05-06 at 10.09.41 PM.png

FP - First Paint - 首次渲染,就是说开始渐进式解析DOM结构并在页面上有所体现了
FCP - First Contentful Paint - 首次内容渲染,此时页面已经包含了一些文字,图标等
DCL - DOMContentLoaded - DOM完全加载及解析事件触发
FMP - First Meaningful Paint - 首次有效渲染,此时页面已经包含了更多文字,图标等
LCP - Large Content Paint - 革命就要胜利了
L - Load 页面加载完成

指标有点多,就用户体验而言,实际项目中我们多参考FP/FCP, 可以理解为白屏时间。

另外还有一个指标叫TTI - Time to Interactive,可交互时间,它描述这样一个时间点

  1. 最后一个长任务完成(耗时大于等于50毫秒的任务)
  2. 随后有5秒的网络和主线程空闲

这一项指标要做得准确比较困难,目前chrome还没有集成。 有兴趣的同学可以了解一下github GoogleChromeLabs/tti-polyfill 项目。

以上是chrome开发工具为我们提供的性能观测指标,此外我们还能通过javascript 在代码层面做一些性能监测,这需要了解一下可怕的 performance API。

2. Performance API

“It's part of the High Resolution Time API, but is enhanced by the Performance Timeline API, the Navigation Timing API, the User Timing API, and the Resource Timing API.”

这段洋文理解起来有点费劲,我们先看盗图:


performance_api_illustration.jpg

Performance API 是 High Resolution Time(高精度时间) API的子集。

Performance Timeline API 是对Performance API的扩展,它提供了访问其他API的统一入口。可以这么理解,Navigation/User/Resource/Frame/Paint Timing API 都是指标,Performance Timeline API 是访问这些指标的统一入口

当我们提到Performance Timeline API 可以狭义的理解为浏览器performance 对象中以下三个主要方法:

  • getEntries()
  • getEntriesByType()
  • getEntriesByName()

ps: 你可能知道,performance 中还有两个对象 timing 和 navigation,通过这两个对象可以绕开performance timeline API 直接访问部分指标,这是早期的访问方式,已不建议使用。

getEntries()
获取所有项

getEntriesByType()
根据type获取,可选的type有以下几种:

  • navigation
  • resource
  • mark
  • measure
  • paint
  • longtask
  • frame
  1. navigation - Navigation Timing API
    获取浏览器上下文,比如DNS查询时间,TCP连接时间。


    Screen Shot 2020-05-07 at 9.47.06 AM.png
  2. resource - Resource Timing API
    获取资源连接信息。


    Screen Shot 2020-05-07 at 9.50.06 AM.png
  3. mark - User Timing API
    获取mark,配合performance.mark() 使用。

performance.mark(‘alpha’)
Screen Shot 2020-05-07 at 9.56.20 AM.png
  1. measure - User Timing API
    获取 measure,配合performance.mark(), performance.measure() 使用。
performance.mark(“alpha’)
performance.mark(“beta’)
performance.measure(“time”,”alpha”,”beta”)
Screen Shot 2020-05-07 at 10.05.42 AM.png
  1. paint - Paint Timing API
    获取FP,FCP 时间。


    Screen Shot 2020-05-07 at 10.07.24 AM.png
  2. longtask - Long Tasks API

获取耗时大于等于50毫秒的任务。

performance.getEntriesByType(‘longtask’)
  1. frame - Framing Timing API
    获取帧变化信息,变化可由以下几种情况触发
  • DOM变化
  • resizing
  • scrolling
  • rendering
  • css 动画

此API似乎还未在chrome上实现。

getEntriesByName()
根据名称获取。

performance.getEntriesByName("first-paint")

performance.mark("alpha")
performance.getEntriesByName("alpha")

Performance.measure(‘time’,"alpha")
performance.getEntriesByName("time")

performance.getEntriesByName("https://www.a.com/logo.png")

3. 指标监测

通过performance timeling api 我们可以计算以下指标:

t = performance.getEntriesByType('navigation')[0]

//重定向耗时
times.redirectTime = t.redirectEnd - t.redirectStart;

//DNS查询耗时
times.dnsTime = t.domainLookupEnd - t.domainLookupStart;

//TTFB
times.ttfbTime = t.responseStart - t.navigationStart;

//DNS缓存耗时
times.appcacheTime = t.domainLookupStart - t.fetchStart;

//卸载页面耗时
times.unloadTime = t.unloadEventEnd - t.unloadEventStart;

//tcp连接耗时
times.tcpTime = t.connectEnd - t.connectStart;

//request请求耗时
times.reqTime = t.responseEnd - t.responseStart;

//解析dom树耗时
times.analysisTime = t.domComplete - t.domInteractive;

//白屏时间 
times.blankTime = t.domInteractive - t.fetchStart;

//DOM加载耗时
times.domReadyTime = t.domContentLoadedEventEnd - t.fetchStart;

4. 响应式监测

通过PerformanceObserver监测由交互、定时任务引起的变化,比如图片懒加载。

var observer = new PerformanceObserver(list => {
      list.getEntries().forEach(entry => {
        // Display each reported measurement on console
        if (console) {
          console.log("Name: "       + entry.name      +
                      ", Type: "     + entry.entryType +
                      ", Start: "    + entry.startTime +
                      ", Duration: " + entry.duration  + "\n");
        }
      })
    });
observer.observe({entryTypes: ['resource']});

参考

10分钟彻底搞懂前端页面性能监控
Performance Observer: Efficient Access to Performance Data
Breaking Down the Performance API
爱奇艺

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352