Web性能监控
web性能的监控,可以用量化为时间指标来进行判断。Web Performance 接口允许网页中的 JavaScript 代码可以通过具体的函数(由 window 对象的 performance 属性提供)测量当前网页页面或者 web应用的性能。 首先我们来看看js中通过调用window.performance拿到的一组精确数据(这是我从console中输入window.performance得到的数据):

数据有了,就有必要了解各种数据的含义:
当然也可以从官方技术文档中了解:点这里
Performance属性
memory
这个属性只在Chrome浏览器中得到支持,所以小心使用。memory有三个属性:
usedJSHeapSize: JS对象占用的内存。
totalJSHeapSize: 总共可供使用的内存。
jsHeapSizeLimit: 内存大小限制。
navigation
这个包括两个属性:
redirectCount: 页面重定向跳转的次数,0表示没有重定向
type: 有四种值
0 即 TYPE_NAVIGATENEXT 正常进入的页面(非刷新、非重定向等)
1 即 TYPE_RELOAD 通过 window.location.reload() 刷新的页面
2 即 TYPE_BACK_FORWARD 通过浏览器的前进后退按钮进入的页面(历史记录)
255 即 TYPE_UNDEFINED 非以上方式进入的页面
timing(性能监控关键)
属性值较多,一个个来理
navigationStart: 当前浏览器窗口的前一个网页关闭,发生unload事件时的Unix毫秒时间戳。如果没有前一个网页,则等于fetchStart属性。
unloadEventStart: 如果前一个网页与当前网页属于同一个域名,则返回前一个网页的unload事件发生时的Unix毫秒时间戳
unloadEventEnd: 和unloadEventStart 相对应。 如果没有前一个网页,或者之前的网页跳转不是在同一个域名内,则返回值为0
redirectStart: 返回第一个HTTP跳转开始时的Unix毫秒时间戳。如果没有跳转,或者不是同一个域名内部的跳转,则返回值为0
redirectEnd: 返回最后一个HTTP跳转结束时(即跳转回应的最后一个字节接受完成时)的Unix毫秒时间戳。如果没有跳转,或者不是同一个域名内部的跳转,则返回值为0。
fetchStart: 返回浏览器准备使用HTTP请求读取文档时的Unix毫秒时间戳。该事件在网页查询本地缓存之前发生
domainLookupStart:返回域名查询开始时的Unix毫秒时间戳。如果使用持久连接,或者信息是从本地缓存获取的,则返回值等同于fetchStart属性的值。
domainLookupEnd:返回域名查询结束时的Unix毫秒时间戳。如果使用持久连接,或者信息是从本地缓存获取的,则返回值等同于fetchStart属性的值。
connectStart:返回HTTP请求开始向服务器发送时的Unix毫秒时间戳。如果使用持久连接(persistent connection),则返回值等同于fetchStart属性的值。
connectEnd:返回浏览器与服务器之间的连接建立时的Unix毫秒时间戳。如果建立的是持久连接,则返回值等同于fetchStart属性的值。连接建立指的是所有握手和认证过程全部结束。
secureConnectionStart: https的ssl的开始时间。如果不是https则时间为0
requestStart: 返回浏览器向服务器发出HTTP请求时(或开始读取本地缓存时)的Unix毫秒时间戳。
responseStart: 返回浏览器从服务器收到(或从本地缓存读取)第一个字节时的Unix毫秒时间戳。
responseEnd: 返回浏览器从服务器收到(或从本地缓存读取)最后一个字节时(如果在此之前HTTP连接已经关闭,则返回关闭时)的Unix毫秒时间戳。
domLoading: 这是整个过程开始的时间戳,浏览器开始解析 HTML 文档第一批收到的字节 document.
domInteractive: 标记浏览器完成解析并且所有 HTML 和 DOM 构建完毕的时间点
domContentLoadedEventStart: 标记 DOM 准备就绪并且没有样式表阻碍 JavaScript 执行的时间点, 意味着我们可以开始构建呈现树了,很多 JavaScript 框架等待此事件发生后,才开始执行它们自己的逻辑。
domContentLoadedEventEnd: DOM 解析完成后,网页内资源加载完成的时间(如 JS 脚本加载执行完毕)
domComplete: 所有的处理完成,网页上所有资源(图片等) 下载完成 – 即加载旋转图标停止旋转
loadEventStart: 作为每个网页加载的最后一步,浏览器会触发onLoad事件,以便触发附加的应用逻辑。这个是开始时间.
loadEventEnd: 对应loadEventStart,这个是结束时间.
含义终于解释完了,现在要用这些指标来计算我们需要的指标。
为了方便理解,网上有张比较好的图片可以参考:

性能数据计算
页面加载时间: 也可以说成用户实际等待页面的时间=loadEventEnd – navigationStart
DOM解析时间 =domComplete – responseEnd
DNS时间 =domainLookupEnd – domainLookupStart
Time To First Byte: 即拿到第一个字节时间(白屏时间)=responseStart – navigationStart
TCP建联时间=connectEnd – connectStart
重定向时间 =redirectEnd – redirectStart
onload回调函数执行时间 =loadEventEnd – loadEventStart
获取DNS缓存的时间=domainLookupStart – fetchStart
DOM准备好时间= domContentLoadedEventEnd – navigationStart
总结
有了这些指标,就能大概能总结web的性能,理解web中一个页面完整的流程是关键。同理,在Android中,我们也能用同样的方法来监控webview的性能,只要通过js注入方式,还能监控js的错误。以上这些,就是做web监控的基本知识,有了这些,监控便能轻松实现。