由于项目需要, 需要对网页的一些性能进行监控, 接触到了performance,

window.performance 提供了一组精确的数据,经过简单的计算就能得出一些网页性能数据, 将这些数据存储为日志, 可有效的对网页性能进行监控.

首先看一下在Chrome 的控制台执行window.performance会出现什么

下面是对这些属性的详细解释:

 performance = {
// memory 是非标准属性,只在 Chrome 有
//这个属性提供了一个可以获取到基本内存使用情况的对象
memory: {
usedJSHeapSize: 10000000, // JS 对象(包括V8引擎内部对象)占用的内存
totalJSHeapSize: 10000000, // 可使用的内存
jsHeapSizeLimit: 2190000000 // 内存大小限制
}, // navigation: 提供操作(包含在 timing 里时间)的有用上下文
//包括页面是加载还是刷新、发生了多少次重定向,等等。
navigation: {
redirectCount: 0, // 重定向次数
type: 0 // 0 正常进入的页面(即非刷新、非重定向等)
// 1 通过 window.location.reload() (即刷新页面)
// 2 通过浏览器的前进后退按钮进入的页面(历史记录)
// 255 非以上方式进入的页面
}, timing: {
// 同一个浏览器上下文的上一个文档卸载(unload)结束时的UNIX时间戳。
//如果没有上一个文档,这个值会和fetchStart相同。
navigationStart: 1441112691935, // 上一个文档unload事件抛出时的UNIX时间戳。
//如果没有上一个文档,这个值会返回0.
unloadEventStart: 0, // 和 unloadEventStart 相对应,unload事件处理完成时的UNIX时间戳。
//如果没有上一个文档,这个值会返回0.
unloadEventEnd: 0, // 第一个HTTP重定向开始时的UNIX时间戳。
//如果没有重定向,或者重定向中的一个不同源,这个值会返回0.
redirectStart: 0, // 最后一个HTTP重定向完成时(也就是说是HTTP响应的最后一个比特直接被收到的时间)的UNIX时间戳。
//如果没有重定向,或者重定向中的一个不同源,这个值会返回0.
redirectEnd: 0, // 浏览器准备好使用HTTP请求来获取(fetch)文档的UNIX时间戳。这个时间点会在检查任何应用缓存之前。
fetchStart: 1441112692155, // DNS 域名查询开始的UNIX时间戳。
//如果使用了持续连接(persistent connection),或者这个信息存储到了缓存或者本地资源上,这个值将和fetchStart一致。
domainLookupStart: 1441112692155, // DNS 域名查询完成的时间.
//如果使用了本地缓存(即无 DNS 查询)或持久连接,则与 fetchStart 值相等
domainLookupEnd: 1441112692155, // HTTP(TCP) 域名查询结束的UNIX时间戳。
//如果使用了持续连接(persistent connection),或者这个信息存储到了缓存或者本地资源上,这个值将和 fetchStart一致。
connectStart: 1441112692155, // HTTP(TCP) 返回浏览器与服务器之间的连接建立时的Unix毫秒时间戳。
// 如果建立的是持久连接,则返回值等同于fetchStart属性的值。
//连接建立指的是所有握手和认证过程全部结束。
connectEnd: 1441112692155, // HTTPS 返回浏览器与服务器开始安全链接的握手时的Unix毫秒时间戳。
//如果当前网页不要求安全连接,则返回0。
secureConnectionStart: 0, // 返回浏览器向服务器发出HTTP请求时(或开始读取本地缓存时)的Unix毫秒时间戳。
requestStart: 1441112692158, // 返回浏览器从服务器收到(或从本地缓存读取)第一个字节时的Unix毫秒时间戳。
//如果传输层在开始请求之后失败并且连接被重开,该属性将会被数制成新的请求的相对应的发起时间。
responseStart: 1441112692686, // 返回浏览器从服务器收到(或从本地缓存读取,或从本地资源读取)最后一个字节时(如果在此之前HTTP连接已经关闭,则返回关闭时)的Unix毫秒时间戳。
responseEnd: 1441112692687, // 当前网页DOM结构开始解析时(即Document.readyState属性变为“loading”、相应的 readystatechange事件触发时)的Unix毫秒时间戳。
domLoading: 1441112692690, // 当前网页DOM结构结束解析、开始加载内嵌资源时(即Document.readyState属性变为“interactive”、相应的readystatechange事件触发时)的Unix毫秒时间戳。
domInteractive: 1441112693093, // 当解析器发送DOMContentLoaded 事件,即所有需要被执行的脚本已经被解析时的Unix毫秒时间戳。
domContentLoadedEventStart: 1441112693093, // 当所有需要立即执行的脚本已经被执行(不论执行顺序)时的Unix毫秒时间戳。
domContentLoadedEventEnd: 1441112693101, // 当前文档解析完成,即Document.readyState 变为 'complete'且相对应的readystatechange 被触发时的Unix毫秒时间戳
domComplete: 1441112693214, // load事件被发送时的Unix毫秒时间戳。如果这个事件还未被发送,它的值将会是0。 loadEventStart: 1441112693214, // 当load事件结束,即加载事件完成时的Unix毫秒时间戳。如果这个事件还未被发送,或者尚未完成,它的值将会是0.
loadEventEnd: 1441112693215
}
};

通过这些属性, 能够计算出一些重要的网页性能数据:

// 计算加载时间
function getPerformanceTiming () {
var performance = window.performance; if (!performance) {
// 当前浏览器不支持
return;
} var t = performance.timing;
var times = {}; //页面加载完成的时间
times.loadPage = t.loadEventEnd - t.navigationStart; //【重要】解析 DOM 树结构的时间
times.domReady = t.domComplete - t.responseEnd; //【重要】重定向的时间
times.redirect = t.redirectEnd - t.redirectStart; //【重要】DNS 查询时间
times.lookupDomain = t.domainLookupEnd - t.domainLookupStart; //【重要】读取页面第一个字节的时间
// TTFB 即 Time To First Byte
times.ttfb = t.responseStart - t.navigationStart; //【重要】内容加载完成的时间
times.request = t.responseEnd - t.requestStart; //【重要】执行 onload 回调函数的时间
//【原因】是否太多不必要的操作都放到 onload 回调函数里执行了,考虑过延迟加载、按需加载的策略么?
times.loadEvent = t.loadEventEnd - t.loadEventStart; // DNS 缓存时间
times.appcache = t.domainLookupStart - t.fetchStart; // 卸载页面的时间
times.unloadEvent = t.unloadEventEnd - t.unloadEventStart; // TCP 建立连接完成握手的时间
times.connect = t.connectEnd - t.connectStart; return times;
}

  

Performance还提供了一些方法供使用

Performance.now()
返回一个 时间戳,表示从参考时刻开始经过的毫秒量
该时间戳的值是从 window.performance.timing 接口的navigationStart属性中的时间戳值为起始点开始计时的.
和JavaScript中其他可用的时间类函数(比如Date.now)不同的是,window.performance.now()返回的时间戳没有被限制在一毫秒的精确度内,而它使用了一个浮点数来达到微秒级别的精确度.
另外一个不同点是,window.performance.now()是以一个恒定的速率慢慢增加的,它不会受到系统时间的影响(可能被其他软件调整)
使用示例:

let t0 = window.performance.now();
doSomething();
let t1 = window.performance.now();
console.log("doSomething函数执行了" + (t1 - t0) + "毫秒.")

Performance.mark()
在浏览器的性能输入缓冲区中创建一个 timestamp,基于给定的 name
示例:

function create_mark(name) {
if (performance.mark === undefined) {
console.log("performance.mark Not supported");
return;
}
// Create the performance mark
performance.mark(name);
// mark 方法是可以创建多条同名 performanceEntry 的,例如:
// performance.mark("begin")
// performance.mark("begin")
// performance.mark("begin")
// performance.mark("begin")
// performance.getEntriesByName("begin")
// [...]
// 0: PerformanceMark { name: "begin", entryType: "mark", startTime: 94661370.14, … }
// ​1: PerformanceMark { name: "begin", entryType: "mark", startTime: 95542853.4, … }​
// 2: PerformanceMark { name: "begin", entryType: "mark", startTime: 95545560.92, … }​
// 3: PerformanceMark { name: "begin", entryType: "mark", startTime: 95548089.94, … }​
// length: 4​
// __proto__: Array []
}

Performance.clearMarks()
移除给定的 mark,从浏览器的性能输入缓冲区中
下面的例子演示clearMarks() 的两种用法。

function clear_mark(name) {
if (performance.clearMarks === undefined) {
console.log("performance.clearMarks Not supported");
return;
}
//移除所有标记了此名称的peformance entry
performance.clearMarks(name);
}
function clear_all_marks() {
if (performance.clearMarks === undefined) {
console.log("performance.clearMarks Not supported");
return;
}
//从performance 缓冲区中移除所有标记的performance entry
performance.clearMarks();
}

Performance.clearMeasures()
移除给定的 measure,从浏览器的性能输入缓冲区中

Performance.clearResourceTimings()
移除所有的 entryType 是 "resource" 的 performance entries,从浏览器的性能数据缓冲区中

Performance.getEntries()
返回一个 PerformanceEntry 对象的列表,基于给定的 filter

Performance.getEntriesByName()
返回一个 PerformanceEntry 对象的列表,基于给定的 name 和 entry type

Performance.getEntriesByType()
返回一个 PerformanceEntry 对象的列表,基于给定的 entry type

Performance.measure()
在浏览器的指定 start mark 和 end mark 间的性能输入缓冲区中创建一个指定的 timestamp

Performance.setResourceTimingBufferSize()
将浏览器的资源 timing 缓冲区的大小设置为 "resource" type performance entry 对象的指定数量

Performance.toJSON() 
是一个 JSON 格式转化器,返回 Performance 对象的 JSON 对象

使用performance的这些属性和方法, 能够准确的记录下我们想要的时间, 再加上日志采集等功能的辅助,我们就能很容易的掌握自己网站的各项性能指标了.

使用performance进行网页性能监控的更多相关文章

  1. 使用performance进行前端性能监控

    该文章仅作为自己的总结 1.performance.timing对象 navigationStart:当前浏览器窗口的前一个网页关闭,发生unload事件时的Unix毫秒时间戳.如果没有前一个网页,则 ...

  2. Performance --- 前端性能监控

    阅读目录 一:什么是Performance? 二:使用 performance.timing 来计算值 三:前端性能如何优化? 四:Performance中方法 五:使用performane编写小工具 ...

  3. Performance Monitor1:开始性能监控

    Performance Monitor是Windows内置的一个可视化监控工具,能够在OS级别上实时记录系统资源的使用情况,通过收集和存储日志数据,在SQL Server发生异常时,能够还原系统当时的 ...

  4. 前端性能监控方案window.performance 调研(转)

    1. 业界案例 目前前端性能监控系统大致为分两类:以GA为代表的代码监控和以webpagetest为代表的工具监控. 代码监控依托于js代码并部署到需监控的页面,手动计算时间差或者使用浏览器的的API ...

  5. Performance — 前端性能监控利器

    Performance是一个做前端性能监控离不开的API,最好在页面完全加载完成之后再使用,因为很多值必须在页面完全加载之后才能得到.最简单的办法是在window.onload事件中读取各种数据. 大 ...

  6. 页面性能监控之performance

    页面性能监测之performance author: @TiffanysBear 最近,需要对业务上的一些性能做一些优化,比如降低首屏时间.减少核心按钮可操作时间等的一些操作:在这之前,需要建立的就是 ...

  7. 前端性能监控之performance

    如果我们想要对一个网页进行性能监控,那么使用window.performance是一个比较好的选择. 我们通过window.performance可以获取到用户访问一个页面的每个阶段的精确时间,从而对 ...

  8. 前端性能监控:window.performance

    window.performance 是W3C性能小组引入的新的API,目前IE9以上的浏览器都支持.一个performance对象的完整结构如下图所示: memory字段代表JavaScript对内 ...

  9. 浏览器性能监控performance使用

    浏览器中有一个performance的性能监控,平时我也没有用到,接手了一个大数据的项目,发现页面打开的比较慢,使用浏览器的performance分析可以看到各个步骤花费的时间. 关于项目的性能分析如 ...

随机推荐

  1. 番外篇--Moddule Zero安装

    Moddule Zero 安装 1.2.1 从模板创建 使用ABP和module-zero开始一个新项目最简单的方式是使用启动模板.详细了解请参考启动模板文档. 1.2.2 手动安装 如果你有一个预先 ...

  2. Jfinal——实践出真知

    什么是Jfinal? JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful.在拥有Java语言所 ...

  3. 从零开始学习前端JAVASCRIPT — 5、JavaScript基础BOM

    1:BOM(Browser  Object  Model)概念 window对象是BOM中所有对象的核心. 2:window属性(较少用) self:self代表自己,相当于window. windo ...

  4. 学而精计算机公共基础学习之路TEST1

    算法 一:算法基本概念 算法是个什么概念学了这么久的程序尽然没有听说过,其实算法就是为了解决问题那么怎么准确完整的解决这个问题就是算法.所以我们所写的程序就可以说为对算法的描述,但是程序编制是不能有于 ...

  5. CCF系列之数位之和(201512-1)

    试题编号: 201512-1试题名称: 数位之和时间限制: 1.0s内存限制: 256.0MB问题描述: 问题描述 给定一个十进制整数n,输出n的各位数字之和. 输入格式 输入一个整数n. 输出格式 ...

  6. Oracle database

    //下面这个通常直选择TCP就好了 此处的全局数据库根据实际情况来确定,如果是第一次,要和第一次一致.(见上面的图中的全局数据库) //这个可以使  计算机名(计算机—>属性).也可以是ip地址 ...

  7. iptables nat及端口映射

    iptables nat及端口映射 发布: 2010-6-11 15:05 | 作者: admin | 来源: SF NetWork 门户网站 iptables 应用初探(nat+三层访问控制) ip ...

  8. grails项目中(DB的相关操作)

    grails项目中(DB的相关操作) save:保存Domain对象的数据到对应的库表中(可能是insert也可能是update) findBy: 动态方法,查找并返回第一条记录,方法名可以变化 eg ...

  9. RadioButton与监听

    public class MainActivity extends Activity implements OnCheckedChangeListener { <RadioGroup andro ...

  10. wamp图标为黄色(非端口号问题)

    1.Win键+R 输入:services.msc  进入服务,找到wamp,看哪个服务没有启动 2.手动启动apache服务失败,弹出以下错误 3.然后在cmd命令行中切换到你的apache的bin目 ...