<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          網(wǎng)頁性能檢測-performance

          共 5699字,需瀏覽 12分鐘

           ·

          2020-12-15 02:53

          網(wǎng)頁性能檢測-performance

          上一篇講到看懂Chrome瀏覽器自帶的Performance性能監(jiān)控,但很多時(shí)候我們希望的是主動(dòng)收集客戶端的數(shù)據(jù),瀏覽器的調(diào)試工具就有些無法滿足了。

          推薦使用window.performance對象。

          一、performance是什么

          允許網(wǎng)頁訪問某些函數(shù)來測量網(wǎng)頁和Web應(yīng)用程序的性能,包括 Navigation Timing API和高分辨率時(shí)間數(shù)據(jù)。

          來源:MDN

          實(shí)質(zhì)上來說performance對象就是專門用于性能監(jiān)測的對象,內(nèi)置了幾乎所有常用前端需要的性能參數(shù)監(jiān)控。

          注意:performance對象的所有API,都是只讀的。

          例如:

          • 自輸入網(wǎng)址回車開始到某一特定時(shí)間
          • 解析dom樹耗時(shí)
          • 白屏?xí)r間
          • domready時(shí)間
          • onload時(shí)間
          • 重定向耗時(shí)
          • request請求耗時(shí)

          還有:

          • 當(dāng)前網(wǎng)頁的全部對象統(tǒng)計(jì)信息
          • 用戶行為信息

          二、performance的兼容性

          performance的監(jiān)控前端性能推出,讓幾乎所有瀏覽器都舒服了一把。(IE9以下除外) 并且各大瀏覽器都在盡力的做向下兼容。

          不能盲目樂觀:

          1. performance的內(nèi)置方法的返回結(jié)果各內(nèi)核瀏覽器不一致,例如:獲取所有所有http請求列表時(shí),F(xiàn)irefox返回結(jié)果包括失敗和成功全部內(nèi)容,Chrome瀏覽器則只返回成功請求。
          2. performance很多內(nèi)置API是基于瀏覽器實(shí)現(xiàn),因此在移動(dòng)端或客戶端上有所限制。(如getEntries()等)

          三、performance的API

          performance`的API比較多,但有幾個(gè)尤為實(shí)用。

          1. performance.now()方法

          performance.now()返回performance.navigationStart至當(dāng)前的毫秒數(shù)。performance.navigationStart是下文將介紹到的可以說是瀏覽器訪問最初的時(shí)間測量點(diǎn)。

          值得注意的兩點(diǎn):

          • 測量初始點(diǎn)是瀏覽器訪問最初測量點(diǎn),或者理解為在地址欄輸入U(xiǎn)RL后按回車的那一瞬間。
          • 返回值是毫秒數(shù),但帶有精準(zhǔn)的多位小數(shù)。

          performance.now()檢測for循環(huán)的執(zhí)行時(shí)間(毫秒)

              var st = performance.now();    for (var o = 0; o < 10000; o ++)  console.log(o)    var end = performance.now();
          console.log(`for時(shí)間${end - st}`); // for時(shí)間1155.9950000373647

          2. performance.navigation屬性

          performance.navigation`負(fù)責(zé)紀(jì)錄用戶行為信息,只有兩個(gè)屬性。

          console.log(performance.navigation);// PerformanceNavigation {type: 1, redirectCount: 0}
          • type:表示網(wǎng)頁的加載來源,可能有4種情況
            • 0:網(wǎng)頁通過點(diǎn)擊鏈接、地址欄輸入、表單提交、腳本操作等方式加載,相當(dāng)于常數(shù)
            • 1:網(wǎng)頁通過“重新加載”按鈕或者location.reload()方法加載
            • 2:網(wǎng)頁通過“前進(jìn)”或“后退”按鈕加載
            • 255:任何其他來源的加載
          • redirectCount:表示當(dāng)前網(wǎng)頁經(jīng)過了多少次重定向跳轉(zhuǎn)。

          3. performance.timing對象

          作為performance最為重要的屬性之一,timing內(nèi)包含了幾乎所有時(shí)間節(jié)點(diǎn)。(附1)

          整理的常用時(shí)間點(diǎn)計(jì)算如下:直接復(fù)制粘貼取用。

          window.onload = function() {  var timing  = performance.timing;  console.log('準(zhǔn)備新頁面時(shí)間耗時(shí): ' + timing.fetchStart - timing.navigationStart);  console.log('redirect 重定向耗時(shí): ' + timing.redirectEnd  - timing.redirectStart);  console.log('Appcache 耗時(shí): ' + timing.domainLookupStart  - timing.fetchStart);  console.log('unload 前文檔耗時(shí): ' + timing.unloadEventEnd - timing.unloadEventStart);  console.log('DNS 查詢耗時(shí): ' + timing.domainLookupEnd - timing.domainLookupStart);  console.log('TCP連接耗時(shí): ' + timing.connectEnd - timing.connectStart);  console.log('request請求耗時(shí): ' + timing.responseEnd - timing.requestStart);  console.log('白屏?xí)r間: ' + timing.responseStart - timing.navigationStart);  console.log('請求完畢至DOM加載: ' + timing.domInteractive - timing.responseEnd);  console.log('解釋dom樹耗時(shí): ' + timing.domComplete - timing.domInteractive);  console.log('從開始至load總耗時(shí): ' + timing.loadEventEnd - timing.navigationStart);}

          值得注意的一點(diǎn):放在window.onload中執(zhí)行,最主要的原因是渲染完成后能拿到大部分timing屬性,也可以放入定時(shí)器中執(zhí)行。

          4. performance.mark(markName)方法

          標(biāo)記在自定義的時(shí)間點(diǎn),對應(yīng)的方法是peformance.clearMarks(markName) / performance.clearMarks();實(shí)測兼容性并不是很理想。。。(或者可能我用的不對)

          5. performance.memory屬性

          performance.memory用于顯示當(dāng)前的內(nèi)存占用情況;

          console.log(performance.memory);/* MemoryInfo {  totalJSHeapSize: 11735319,  usedJSHeapSize: 9259919,  jsHeapSizeLimit: 2197815296} */
          • usedJSHeapSize表示:JS 對象(包括V8引擎內(nèi)部對象)占用的內(nèi)存數(shù)
          • totalJSHeapSize表示:可使用的內(nèi)存
          • jsHeapSizeLimit表示:內(nèi)存大小限制

          通常,usedJSHeapSize不能大于totalJSHeapSize,如果大于,有可能出現(xiàn)了內(nèi)存泄漏。

          6. performance.getEntries()方法

          瀏覽器獲取網(wǎng)頁時(shí),會(huì)對網(wǎng)頁中每一個(gè)對象(腳本文件、樣式表、圖片文件等等)發(fā)出一個(gè)HTTP請求。performance.getEntries方法以數(shù)組形式,返回一個(gè)PerformanceEntry列表,這些請求的時(shí)間統(tǒng)計(jì)信息,有多少個(gè)請求,返回?cái)?shù)組就會(huì)有多少個(gè)成員。

          name:資源名稱,是資源的絕對路徑或調(diào)用mark方法自定義的名稱startTime:開始時(shí)間duration:加載時(shí)間entryType:資源類型,entryType類型不同數(shù)組中的對象結(jié)構(gòu)也不同!具體見下initiatorType:誰發(fā)起的請求,具體見下

          entryType的值:

          該類型對象描述
          markPerformanceMark通過mark()方法添加到數(shù)組中的對象
          measurePerformanceMeasure通過measure()方法添加到數(shù)組中的對象
          paintPerformancePaintTiming值為first-paint'首次繪制、'first-contentful-paint'首次內(nèi)容繪制。
          resourcePerformanceResourceTiming所有資源加載時(shí)間,用處最多
          navigationPerformanceNavigationTiming現(xiàn)除chrome和Opera外均不支持,導(dǎo)航相關(guān)信息
          framePerformanceFrameTiming現(xiàn)瀏覽器均未支持

          也可參見:MDN

          initiatorType的值:

          發(fā)起對象描述
          a Elementlink/script/img/iframe通過標(biāo)簽形式加載的資源,值是該節(jié)點(diǎn)名的小寫形式
          a CSS resourccss通過css樣式加載的資源,比如background的url方式加載資源
          a XMLHttpRequest objectxmlhttprequest/fetch通過xhr加載的資源
          a PerformanceNavigationTiming objectnavigation當(dāng)對象是PerformanceNavigationTiming時(shí)返回

          1. 只能在瀏覽器中使用2. 該方法返回的數(shù)組第一項(xiàng)是HTML頁面信息

          四、如何將performance的信息傳遞出去

          1. sendBeacon方法
          2. 動(dòng)態(tài)標(biāo)簽
          3. web wroker

          這些都是后話啦。。。


          引用:

          1. https://developer.mozilla.org/zh-CN/docs/Web/API/Window/performance
          2. https://developer.mozilla.org/en-US/docs/Web/API/Navigation_timing_API
          3. http://javascript.ruanyifeng.com/bom/performance.html
          4. https://www.cnblogs.com/bldxh/p/6857324.html

          附1:

          屬性名含義
          navigationStart瀏覽器窗口的前一個(gè)網(wǎng)頁關(guān)閉時(shí)發(fā)生unload事件時(shí)的Unix時(shí)間戳,屬于最前的測量時(shí)間點(diǎn)
          unloadEventStart前網(wǎng)頁與當(dāng)前網(wǎng)頁同屬一個(gè)域名時(shí),返回前一個(gè)網(wǎng)頁的unload事件發(fā)生時(shí)的Unix時(shí)間戳
          unloadEventEnd前網(wǎng)頁與當(dāng)前網(wǎng)頁同屬一個(gè)域名時(shí),返回前一個(gè)網(wǎng)頁unload事件的回調(diào)函數(shù)結(jié)束時(shí)的Unix時(shí)間戳
          redirectStart返回第一個(gè)HTTP跳轉(zhuǎn)開始時(shí)的Unix時(shí)間戳
          redirectEnd返回最后一個(gè)HTTP跳轉(zhuǎn)結(jié)束時(shí)的Unix時(shí)間戳
          fetchStart返回瀏覽器準(zhǔn)備使用HTTP請求讀取文檔等資源時(shí)的Unix時(shí)間戳,在網(wǎng)頁查詢本地緩存之前發(fā)生
          domainLookupStart返回域名查詢開始時(shí)的Unix時(shí)間戳。如果使用持久連接,或者信息是從本地緩存獲取的,則返回值等同于fetchStart屬性的值
          domainLookupEnd返回域名查詢結(jié)束時(shí)的Unix毫秒時(shí)間戳。如果使用持久連接,或者信息是從本地緩存獲取的,則返回值等同于fetchStart屬性的值
          connectStart返回HTTP請求開始向服務(wù)器發(fā)送時(shí)的Unix毫秒時(shí)間戳。如果使用持久連接(persistent connection),則返回值等同于fetchStart屬性的值
          connectEnd返回瀏覽器與服務(wù)器之間的連接建立時(shí)的Unix毫秒時(shí)間戳。如果建立的是持久連接,則返回值等同于fetchStart屬性的值。連接建立指的是所有握手和認(rèn)證過程全部結(jié)束
          secureConnectionStart返回瀏覽器與服務(wù)器開始安全鏈接的握手時(shí)的Unix毫秒時(shí)間戳。如果當(dāng)前網(wǎng)頁不要求安全連接,則返回0
          requestStart返回瀏覽器向服務(wù)器發(fā)出HTTP請求時(shí)(或開始讀取本地緩存時(shí))的Unix毫秒時(shí)間戳
          responseStart返回瀏覽器從服務(wù)器收到(或從本地緩存讀?。┑谝粋€(gè)字節(jié)時(shí)的Unix毫秒時(shí)間戳
          responseEnd返回瀏覽器從服務(wù)器收到(或從本地緩存讀取)最后一個(gè)字節(jié)時(shí)(如果在此之前HTTP連接已經(jīng)關(guān)閉,則返回關(guān)閉時(shí))的Unix毫秒時(shí)間戳
          domLoading返回當(dāng)前網(wǎng)頁DOM結(jié)構(gòu)開始解析時(shí)(即Document.readyState屬性變?yōu)椤發(fā)oading”、相應(yīng)的readystatechange事件觸發(fā)時(shí))的Unix毫秒時(shí)間戳
          domInteractive返回當(dāng)前網(wǎng)頁DOM結(jié)構(gòu)結(jié)束解析、開始加載內(nèi)嵌資源時(shí)(即Document.readyState屬性變?yōu)椤癷nteractive”、相應(yīng)的readystatechange事件觸發(fā)時(shí))的Unix毫秒時(shí)間戳
          domContentLoadedEventStart返回當(dāng)前網(wǎng)頁DOMContentLoaded事件發(fā)生時(shí)(即DOM結(jié)構(gòu)解析完畢、所有腳本開始運(yùn)行時(shí))的Unix毫秒時(shí)間戳
          domContentLoadedEventEnd返回當(dāng)前網(wǎng)頁所有需要執(zhí)行的腳本執(zhí)行完成時(shí)的Unix毫秒時(shí)間戳
          domComplete返回當(dāng)前網(wǎng)頁DOM結(jié)構(gòu)生成時(shí)(即Document.readyState屬性變?yōu)椤癱omplete”,以及相應(yīng)的readystatechange事件發(fā)生時(shí))的Unix毫秒時(shí)間戳
          loadEventStart返回當(dāng)前網(wǎng)頁load事件的回調(diào)函數(shù)開始時(shí)的Unix毫秒時(shí)間戳。如果該事件還沒有發(fā)生,返回0
          loadEventEnd返回當(dāng)前網(wǎng)頁load事件的回調(diào)函數(shù)運(yùn)行結(jié)束時(shí)的Unix毫秒時(shí)間戳。如果該事件還沒有發(fā)生,返回0


          瀏覽 39
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久久久久久久久久久久久久久久久久久 | 北条麻妃一区二区三区成人片 | 99热精品在线 | 制服.丝袜.亚洲.中文 | 黄色福利|