計(jì)算頁面加載時(shí)間-Performance API簡(jiǎn)介

Performance API簡(jiǎn)介

  • Performance API是什么盯荤?

    衡量和分析各種性能指標(biāo)對(duì)于確保 web 應(yīng)用的速度非常重要完疫。Performance API 提供了重要的內(nèi)置指標(biāo),并能夠?qū)⒛阕约旱臏y(cè)量結(jié)果添加到瀏覽器的性能時(shí)間線(performance timeline)中滞乙。性能時(shí)間線使用高精度的時(shí)間戳,且可以在開發(fā)者工具中顯示鉴嗤。你還可以將相關(guān)數(shù)據(jù)發(fā)送到用于分析的端點(diǎn)斩启,以根據(jù)時(shí)間記錄性能指標(biāo)。

  • Performance API的作用和優(yōu)勢(shì)

    • 1. 提供詳細(xì)的性能信息:Performance API不僅提供了頁面加載時(shí)間等基本信息醉锅,還提供了更詳細(xì)的性能數(shù)據(jù)兔簇,如各個(gè)階段的開始和結(jié)束時(shí)間、資源加載時(shí)間硬耍、事件處理時(shí)間等垄琐。這些詳細(xì)信息可以幫助開發(fā)者更準(zhǔn)確地分析和定位性能問題。

    • 2. 支持多種性能指標(biāo):Performance API支持多種常用的性能指標(biāo)经柴,如頁面加載時(shí)間狸窘、資源加載時(shí)間、重定向次數(shù)坯认、DNS解析耗時(shí)等翻擒。這些指標(biāo)可以幫助開發(fā)者全面評(píng)估網(wǎng)頁的性能氓涣,并進(jìn)行有針對(duì)性的優(yōu)化。

    • 3. 可以與其他API集成:Performance API可以與其他API集成使用陋气,如Navigation Timing API劳吠、Resource Timing API等。通過結(jié)合使用不同的API巩趁,開發(fā)者可以獲取更全面和準(zhǔn)確的性能數(shù)據(jù)痒玩,并進(jìn)行更深入的分析和優(yōu)化。

    • 4. 提升用戶體驗(yàn):通過使用Performance API來優(yōu)化網(wǎng)頁性能议慰,可以提升用戶的體驗(yàn)蠢古。快速加載的網(wǎng)頁可以減少用戶等待時(shí)間褒脯,流暢的交互性能可以提高用戶的操作體驗(yàn)便瑟,從而增加用戶的滿意度和留存率。

window.performance

performance.timing字段介紹

image.png

navigationStart 初始化頁面番川,在同一個(gè)瀏覽器上下文中前一個(gè)頁面unload的時(shí)間戳到涂,如果沒有前一個(gè)頁面的unload,則與fetchStart值相等
redirectStart 第一個(gè)HTTP重定向發(fā)生的時(shí)間,有跳轉(zhuǎn)且是同域的重定向,否則為0
redirectEnd 最后一個(gè)重定向完成時(shí)的時(shí)間,否則為0
fetchStart 瀏覽器準(zhǔn)備好使用http請(qǐng)求獲取文檔的時(shí)間,這發(fā)生在檢查緩存之前
domainLookupStart DNS域名開始查詢的時(shí)間,如果有本地的緩存或keep-alive則時(shí)間為0
domainLookupEnd DNS域名結(jié)束查詢的時(shí)間
connectStart TCP開始建立連接的時(shí)間,如果是持久連接,則與fetchStart值相等
secureConnectionStart https 連接開始的時(shí)間,如果不是安全連接則為0
connectEnd TCP完成握手的時(shí)間,如果是持久連接則與fetchStart值相等
requestStart HTTP請(qǐng)求讀取真實(shí)文檔開始的時(shí)間,包括從本地緩存讀取
requestEnd HTTP請(qǐng)求讀取真實(shí)文檔結(jié)束的時(shí)間,包括從本地緩存讀取
responseStart 返回瀏覽器從服務(wù)器收到(或從本地緩存讀劝涠健)第一個(gè)字節(jié)時(shí)的Unix毫秒時(shí)間戳
responseEnd 返回瀏覽器從服務(wù)器收到(或從本地緩存讀取践啄,或從本地資源讀取)最后一個(gè)字節(jié)時(shí)的Unix毫秒時(shí)間戳
unloadEventStart 前一個(gè)頁面的unload的時(shí)間戳 如果沒有則為0
unloadEventEnd 與unloadEventStart相對(duì)應(yīng)沉御,返回的是unload函數(shù)執(zhí)行完成的時(shí)間戳
domLoading 返回當(dāng)前網(wǎng)頁DOM結(jié)構(gòu)開始解析時(shí)的時(shí)間戳,此時(shí)document.readyState變成loading,并將拋出readyStateChange事件
domInteractive 返回當(dāng)前網(wǎng)頁DOM結(jié)構(gòu)結(jié)束解析屿讽、開始加載內(nèi)嵌資源時(shí)時(shí)間戳,document.readyState 變成interactive,并將拋出readyStateChange事件(注意只是DOM樹解析完成,這時(shí)候并沒有開始加載網(wǎng)頁內(nèi)的資源)
domContentLoadedEventStart 網(wǎng)頁domContentLoaded事件發(fā)生的時(shí)間
domContentLoadedEventEnd 網(wǎng)頁domContentLoaded事件腳本執(zhí)行完畢的時(shí)間,domReady的時(shí)間
domComplete DOM樹解析完成,且資源也準(zhǔn)備就緒的時(shí)間,document.readyState變成complete.并將拋出readystatechange事件
loadEventStart load 事件發(fā)送給文檔吠裆,也即load回調(diào)函數(shù)開始執(zhí)行的時(shí)間
loadEventEnd load回調(diào)函數(shù)執(zhí)行完成的時(shí)間

1. Performance接口`

  • 獲取頁面加載時(shí)間
  • 獲取頁面資源加載時(shí)間

使用示例:

`// 獲取頁面加載時(shí)間
const loadTime = window.performance.timing.loadEventEnd - window.performance.timing.navigationStart;
console.log('頁面加載時(shí)間:', loadTime);

// 獲取資源加載時(shí)間
const resources = window.performance.getEntriesByType('resource');
resources.forEach(resource => {
 console.log('資源URL:', resource.name);
 console.log('資源加載時(shí)間:', resource.duration);
}); 

2. PerformanceTiming接口`

PerformanceTiming接口提供了更詳細(xì)的頁面加載時(shí)間信息伐谈,包括各個(gè)階段的開始和結(jié)束時(shí)間。它是Performance API中用于測(cè)量頁面性能的重要接口试疙。

  • 獲取重定向耗時(shí)
  • 獲取DNS解析耗時(shí)
  • 獲取TCP連接耗時(shí)

使用示例:

const timing = window.performance.timing;
const redirectTime = timing.redirectEnd - timing.redirectStart;
const dnsTime = timing.domainLookupEnd - timing.domainLookupStart;
const tcpTime = timing.connectEnd - timing.connectStart;

console.log('重定向耗時(shí):', redirectTime);
console.log('DNS解析耗時(shí):', dnsTime);
console.log('TCP連接耗時(shí):', tcpTime);` 

3. PerformanceNavigation接口`

PerformanceNavigation接口提供了有關(guān)頁面導(dǎo)航的信息诵棵,如重定向次數(shù)、是否通過緩存加載等祝旷。它可以幫助開發(fā)者了解頁面導(dǎo)航過程中的性能指標(biāo)履澳。

使用示例:

const navigation = window.performance.navigation;
console.log('重定向次數(shù):', navigation.redirectCount);
console.log('是否通過緩存加載:', navigation.type === 1 ? '是' : '否');

4. PerformanceEntry接口`

PerformanceEntry接口提供了有關(guān)特定資源或事件的詳細(xì)性能信息,如資源加載時(shí)間怀跛、事件處理時(shí)間等距贷。它可以用于監(jiān)控和分析特定資源或事件的性能。

使用示例:

// 監(jiān)控資源加載性能
window.performance.getEntriesByType('resource').forEach(entry => {
 console.log('資源URL:', entry.name);
 console.log('資源加載時(shí)間:', entry.duration);
 console.log('資源大小:', entry.transferSize);
});

// 監(jiān)控事件處理性能
window.performance.getEntriesByType('event').forEach(entry => {
 console.log('事件類型:', entry.name);
 console.log('事件處理時(shí)間:', entry.duration);
});

這些示例展示了Performance API中各個(gè)接口的基本用法吻谋,開發(fā)者可以根據(jù)具體需求使用不同的接口來獲取更詳細(xì)和準(zhǔn)確的性能信息忠蝗,并進(jìn)行相應(yīng)的優(yōu)化和分析。

實(shí)際應(yīng)用場(chǎng)景

1. 如何利用Performance API優(yōu)化網(wǎng)頁加載速度

  • 使用Performance API獲取頁面加載時(shí)間漓拾,找出加載時(shí)間較長(zhǎng)的資源什湘,并進(jìn)行優(yōu)化长赞。
const loadTime = window.performance.timing.loadEventEnd - window.performance.timing.navigationStart;
console.log('頁面加載時(shí)間:', loadTime);

const resources = window.performance.getEntriesByType('resource');
resources.forEach(resource => {
 if (resource.duration > 1000) {
 console.log('加載時(shí)間較長(zhǎng)的資源:', resource.name);
 // 進(jìn)行相應(yīng)的優(yōu)化,如壓縮闽撤、緩存等
 }
});
  • 使用Performance API監(jiān)控資源加載性能得哆,找出加載時(shí)間較長(zhǎng)的資源,并進(jìn)行優(yōu)化哟旗。
window.performance.getEntriesByType('resource').forEach(entry => {
 if (entry.duration > 1000) {
 console.log('加載時(shí)間較長(zhǎng)的資源:', entry.name);
 // 進(jìn)行相應(yīng)的優(yōu)化贩据,如壓縮、緩存等
 }
});

2. 如何利用Performance API監(jiān)控用戶交互性能:

  • 監(jiān)控用戶點(diǎn)擊按鈕的交互性能闸餐。
document.querySelector('#myButton').addEventListener('click', function(event) {
 const interactionTime = window.performance.now() - event.timeStamp;
 console.log('用戶點(diǎn)擊交互時(shí)間:', interactionTime);
});
  • 監(jiān)控用戶滾動(dòng)頁面的交互性能饱亮。
document.addEventListener('scroll', function(event) {
 const interactionTime = window.performance.now() - event.timeStamp;
 console.log('用戶滾動(dòng)交互時(shí)間:', interactionTime);
});

通過使用Performance API,開發(fā)者可以獲取頁面加載時(shí)間和資源加載性能舍沙,從而找出加載時(shí)間較長(zhǎng)的資源并進(jìn)行優(yōu)化近上。同時(shí),通過監(jiān)控用戶交互性能拂铡,開發(fā)者可以了解用戶與網(wǎng)頁的交互體驗(yàn)壹无,并進(jìn)行相應(yīng)的優(yōu)化。這些實(shí)際應(yīng)用場(chǎng)景和示例代碼可以幫助開發(fā)者更好地利用Performance API來優(yōu)化網(wǎng)頁性能感帅。

原文地址:https://juejin.cn/post/7291586138103038010
MDN: https://developer.mozilla.org/zh-CN/docs/Web/API/Performance_API

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末斗锭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子失球,更是在濱河造成了極大的恐慌岖是,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件实苞,死亡現(xiàn)場(chǎng)離奇詭異豺撑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)黔牵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門前硫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人荧止,你說我怎么就攤上這事〗捉#” “怎么了跃巡?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)牧愁。 經(jīng)常有香客問我素邪,道長(zhǎng),這世上最難降的妖魔是什么猪半? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任兔朦,我火速辦了婚禮偷线,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沽甥。我一直安慰自己声邦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布摆舟。 她就那樣靜靜地躺著亥曹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恨诱。 梳的紋絲不亂的頭發(fā)上媳瞪,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音照宝,去河邊找鬼蛇受。 笑死,一個(gè)胖子當(dāng)著我的面吹牛厕鹃,可吹牛的內(nèi)容都是我干的兢仰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼熊响,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼旨别!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起汗茄,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤秸弛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后洪碳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體递览,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年瞳腌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绞铃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嫂侍,死狀恐怖儿捧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挑宠,我是刑警寧澤菲盾,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站各淀,受9級(jí)特大地震影響懒鉴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一临谱、第九天 我趴在偏房一處隱蔽的房頂上張望璃俗。 院中可真熱鬧,春花似錦悉默、人聲如沸城豁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钮蛛。三九已至,卻和暖如春剖膳,著一層夾襖步出監(jiān)牢的瞬間魏颓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工吱晒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甸饱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓仑濒,卻偏偏與公主長(zhǎng)得像叹话,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子墩瞳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容