美文网首页
Performance.timing

Performance.timing

作者: 冷暖自知_zjz | 来源:发表于2023-10-23 10:53 被阅读0次

    Performance.timing

    已弃用: 不再推荐使用该特性。虽然一些浏览器仍然支持它,但也许已从相关的 web 标准中移除,也许正准备移除或出于兼容性而保留。请尽量不要使用该特性,并更新现有的代码;参见本页面底部的兼容性表格以指导你作出决定。请注意,该特性随时可能无法正常工作。

    window.performance.timing API 早期是 HTML5 所提出的一项标准,目前已经成为 Web 前端开发的常见性能统计手段之一,该 API 的兼容性非常好,几乎所有现代浏览器都支持该 API。

    典型的现代浏览器如 Chrome、Firefox、Safari 和 Edge 等均支持 performance.timing API,其兼容性覆盖了大部分的用户。但是,IE 浏览器的支持相对较差,部分版本的 IE 浏览器不支持 performance.timing API,或者会出现兼容性问题。

    为了兼容所有浏览器,应该在代码中做出相应的判断,针对支持和不支持 performance.timing API 的两种情况分别编写代码。另外,建议在代码中添加兼容性提示,以增加代码的易读性和维护性。

    可以使用浏览器自带的 Performance API 来统计 Vue 页面加载耗时。具体步骤如下:

      在 Vue 页面的 mounted 生命周期钩子函数内执行以下代码:

    let timing = window.performance.timing;
    let loadTime = timing.loadEventEnd - timing.navigationStart;
    console.log('页面加载耗时:' + loadTime + 'ms');
    
    

      在浏览器的开发者工具中,选择 Performance 标签,在左侧菜单中选择「性能分析」或「时间轴」,即可查看页面加载耗时的统计信息。

    注意:上述方法只能在支持 Performance API 的现代浏览器中使用,对于不支持 Performance API 的旧版浏览器,可以考虑使用其他统计方法或工具。

    window.onload = function() {
      var timing  = performance.timing;
      console.log('准备新页面时间耗时: ' + timing.fetchStart - timing.navigationStart);
      console.log('redirect 重定向耗时: ' + timing.redirectEnd  - timing.redirectStart);
      console.log('Appcache 耗时: ' + timing.domainLookupStart  - timing.fetchStart);
      console.log('unload 前文档耗时: ' + timing.unloadEventEnd - timing.unloadEventStart);
      console.log('DNS 查询耗时: ' + timing.domainLookupEnd - timing.domainLookupStart);
      console.log('TCP连接耗时: ' + timing.connectEnd - timing.connectStart);
      console.log('request请求耗时: ' + timing.responseEnd - timing.requestStart);
      console.log('白屏时间: ' + timing.responseStart - timing.navigationStart);
      console.log('请求完毕至DOM加载: ' + timing.domInteractive - timing.responseEnd);
      console.log('解释dom树耗时: ' + timing.domComplete - timing.domInteractive);
      console.log('从开始至load总耗时: ' + timing.loadEventEnd - timing.navigationStart);
    }
    

    performance.timing 对象包含以下属性(全部为只读):

    • navigationStart:当前浏览器窗口的前一个网页关闭,发生unload事件时的Unix毫秒时间戳。如果没有前一个网页,则等于fetchStart属性。

    • unloadEventStart:如果前一个网页与当前网页属于同一个域名,则返回前一个网页的unload事件发生时的Unix毫秒时间戳。如果没有前一个网页,或者之前的网页跳转不是在同一个域名内,则返回值为0。

    • unloadEventEnd:如果前一个网页与当前网页属于同一个域名,则返回前一个网页unload事件的回调函数结束时的Unix毫秒时间戳。如果没有前一个网页,或者之前的网页跳转不是在同一个域名内,则返回值为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:返回浏览器与服务器开始安全链接的握手时的Unix毫秒时间戳。如果当前网页不要求安全连接,则返回0。

    • requestStart:返回浏览器向服务器发出HTTP请求时(或开始读取本地缓存时)的Unix毫秒时间戳。

    • responseStart:返回浏览器从服务器收到(或从本地缓存读取)第一个字节时的Unix毫秒时间戳。

    • responseEnd:返回浏览器从服务器收到(或从本地缓存读取)最后一个字节时(如果在此之前HTTP连接已经关闭,则返回关闭时)的Unix毫秒时间戳。

    • domLoading:返回当前网页DOM结构开始解析时(即Document.readyState属性变为“loading”、相应的readystatechange事件触发时)的Unix毫秒时间戳。

    • domInteractive:返回当前网页DOM结构结束解析、开始加载内嵌资源时(即Document.readyState属性变为“interactive”、相应的readystatechange事件触发时)的Unix毫秒时间戳。

    • domContentLoadedEventStart:返回当前网页DOMContentLoaded事件发生时(即DOM结构解析完毕、所有脚本开始运行时)的Unix毫秒时间戳。

    • domContentLoadedEventEnd:返回当前网页所有需要执行的脚本执行完成时的Unix毫秒时间戳。

    • domComplete:返回当前网页DOM结构生成时(即Document.readyState属性变为“complete”,以及相应的readystatechange事件发生时)的Unix毫秒时间戳。

    • loadEventStart:返回当前网页load事件的回调函数开始时的Unix毫秒时间戳。如果该事件还没有发生,返回0。

    • loadEventEnd:返回当前网页load事件的回调函数运行结束时的Unix毫秒时间戳。如果该事件还没有发生,返回0。

    计算性能指标

    • DNS查询耗时 = domainLookupEnd - domainLookupStart

    • TCP链接耗时 = connectEnd - connectStart

    • request请求耗时 = responseEnd - responseStart

    • 解析dom树耗时 = domComplete - domInteractive

    • domready时间 = domContentLoadedEventEnd - fetchStart

    • 首屏渲染时间、首次有内容渲染时间 performance.getEntriesByType('paint') https://w3c.github.io/paint-timing/

    • onload时间 = loadEventEnd - fetchStart

    新的代替api

    现在推荐使用新的 window.performance.getEntries() API 来代替。

    使用方法如下:

      在 Vue 页面的 mounted 生命周期钩子函数内执行以下代码:

    let entries = performance.getEntriesByType('navigation');
    let loadTime = entries[0].loadEventEnd - entries[0].navigationStart;
    console.log('页面加载耗时:' + loadTime + 'ms');
    
    

    其中,getEntriesByType('navigation') 方法返回所有“navigation”类型资源(例如页面或location.replace())的性能记录,而不是所有资源的记录。因此可以从中得到页面加载的统计信息。

      在浏览器的开发者工具中,选择 Performance 标签,在左侧菜单中选择「性能分析」或「时间轴」,即可查看页面加载耗时的统计信息。

    需要注意的是,window.performance.getEntries() 仅在支持 Performance API 的现代浏览器中可用,并且返回的记录可能因浏览器而异。

    为了保证代码的兼容性,应该检测浏览器是否支持 window.performance.getEntries() API,并做出相应的处理。

    可以使用以下代码来检测该 API 的存在:

    if (window.performance && typeof window.performance.getEntries === 'function') {
      // 支持 window.performance.getEntries() API
    } else {
      // 不支持 window.performance.getEntries() API,需使用其他方法
    }
    
    

    上述代码中,首先检查 window.performance 是否存在,然后判断 window.performance.getEntries 是否为一个函数。如果支持该 API,则执行相关代码;否则,可以使用 window.performance.timing 等其他方法来统计页面加载时间。

    使用该方法可以确保代码在不同浏览器中具有更好的兼容性。

    timing: PerformanceTiming
    // 在同一个浏览器上下文中,前一个网页(与当前页面不一定同域)unload 的时间戳,如果无前一个网页 unload ,则与 fetchStart 值相等
    connectEnd: 1649942785899  // HTTP(TCP) 完成建立连接的时间(完成握手),如果是持久连接,则与 fetchStart 值相等,注意如果在传输层发生了错误且重新建立连接,则这里显示的是新建立的连接完成的时间,这里握手结束,包括安全连接建立完成、SOCKS 授权通过
    connectStart: 1649942785899 // HTTP(TCP) 开始建立连接的时间,如果是持久连接,则与 fetchStart 值相等,注意如果在传输层发生了错误且重新建立连接,则这里显示的是新建立的连接开始的时间
    domComplete: 1649942786530 // DOM 树解析完成,且资源也准备就绪的时间,Document.readyState 变为 complete,并将抛出 readystatechange 相关事件
    domContentLoadedEventEnd: 1649942786450  // DOM 解析完成后,网页内资源加载开始的时间,在 DOMContentLoaded 事件抛出前发生
    domContentLoadedEventStart: 1649942786450 // DOM 解析完成后,网页内资源加载完成的时间(如 JS 脚本加载执行完毕)
    domInteractive: 1649942786450 // 注意只是 DOM 树解析完成,这时候并没有开始加载网页内的资源
    domLoading: 1649942786080 // 开始解析渲染 DOM 树的时间,此时 Document.readyState 变为 loading,并将抛出 readystatechange 相关事件
    domainLookupEnd: 1649942785899 // DNS 域名查询完成的时间,如果使用了本地缓存(即无 DNS 查询)或持久连接,则与 fetchStart 值相等
    domainLookupStart: 1649942785899 // DNS 域名查询开始的时间,如果使用了本地缓存(即无 DNS 查询)或持久连接,则与 fetchStart 值相等
    fetchStart: 1649942785899 // 浏览器准备好使用 HTTP 请求抓取文档的时间,这发生在检查本地缓存之前
    loadEventEnd: 1649942786531 // load 事件的回调函数执行完毕的时间
    loadEventStart: 1649942786530  // load 事件发送给文档,也即 load 回调函数开始执行的时间,注意如果没有绑定 load 事件,值为 0
    navigationStart: 1649942785896
    redirectEnd: 0 // 最后一个 HTTP 重定向完成时的时间。有跳转且是同域名内部的重定向才算,否则值为 0
    redirectStart: 0 // 第一个 HTTP 重定向发生时的时间。有跳转且是同域名内的重定向才算,否则值为 0
    requestStart: 1649942785903  // HTTP 请求读取真实文档开始的时间(完成建立连接),包括从本地读取缓存,连接错误重连时,这里显示的也是新建立连接的时间
    responseEnd: 1649942786434 // HTTP 响应全部接收完成的时间(获取到最后一个字节),包括从本地读取缓存
    responseStart: 1649942786060 // HTTP 开始接收响应的时间(获取到第一个字节),包括从本地读取缓存
    secureConnectionStart: 0 // HTTPS 连接开始的时间,如果不是安全连接,则值为 0
    unloadEventEnd: 1649942786077 // 和 unloadEventStart 相对应,返回前一个网页 unload 事件绑定的回调函数执行完毕的时间戳
    unloadEventStart: 1649942786077 // 前一个网页(与当前页面同域)unload 的时间戳,如果无前一个网页 unload 或者前一个网页与当前页面不同域,则值为 0
    

    下图显示了 PerformanceNavigationTiming 中定义的所有时间戳属性。

    timestamp-diagram.jpg

    相关文章

      网友评论

          本文标题:Performance.timing

          本文链接:https://www.haomeiwen.com/subject/axtjidtx.html