溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

實踐一下前端性能分析

發(fā)布時間:2020-06-22 11:29:51 來源:網(wǎng)絡(luò) 閱讀:239 作者:張濤澤 欄目:網(wǎng)絡(luò)安全

一、瀏覽器并行下載數(shù)量

瀏覽器的并發(fā)請求數(shù)目限制是針對同一域名的。

同一時間針對同一域名下的請求有一定數(shù)量限制,超過限制數(shù)目的請求會被阻塞。

所以我們經(jīng)常能看到不同靜態(tài)資源會有不同域名,例如圖片、JavaScript、CSS等。

HTTP1.1與HTTP1.0,限制的數(shù)量還不一樣。

1)HTTP1.1

先來看看browserscope網(wǎng)上的數(shù)量限制的統(tǒng)計結(jié)果,比IE6、IE7那會兒進步了很多。

實踐一下前端性能分析

接下來做一個對比,分別是一個域名兩個域名,分別加載圖片。

實踐一下前端性能分析

當一個域名的時候最多只能并發(fā)6個請求,而兩個域名的時候能并發(fā)10個請求。

實踐一下前端性能分析

 

2)長連接

由于長連接的關(guān)系,HTTP1.1建議每個服務(wù)器建立少量的連接。

如果瀏覽器支持 keep-alive(長連接),它會在請求的包頭中添加:

實踐一下前端性能分析

長連接的原理是使用同一個TCP連接來發(fā)送和接收多個HTTP請求/應(yīng)答,而不是為每一個新的請求/應(yīng)答打開新的連接的方法。

當客戶端發(fā)送另一個請求時,它會使用同一個連接。這一直繼續(xù)到客戶端或服務(wù)器端認為會話已經(jīng)結(jié)束,其中一方中斷連接。

下圖左邊每次請求后都會斷開,右邊就是請求后不會馬上斷開。

實踐一下前端性能分析

所以想要高并發(fā)量還可以降級到HTTP1.0,不過具體情況如何,我還沒試驗過。

 

3)Cookie-free Domains

YSlow中有23條規(guī)則,第20條就是“Use Cookie-Free Domains for Components”。

在請求下載靜態(tài)小圖片、靜態(tài)小文件的時候,瀏覽器會把它當成普通請求一樣,在request的header信息里附加cookie信息。

如果每個header都附加1kB的cookie,那么對于一個有50個小文件的復(fù)雜網(wǎng)頁來講,就白白增加了50kB的傳輸量。

網(wǎng)上有很多相關(guān)的解決方案,可以嘗試一下。

 

二、行內(nèi)腳本阻塞并行下載

覽器會保持css和js的解析順序,如果把行內(nèi)腳本放在樣式表之后,會明顯地延遲資源的下載(結(jié)果是樣式表下載完成并且行內(nèi)腳本執(zhí)行完畢時,后續(xù)資源才能開始下載)。

這是因為行內(nèi)腳本可能含有依賴于樣式表中樣式的代碼,比如document.getElementsByClassName()

行內(nèi)腳本就是將腳本直接寫在HTML頁面中。

實踐一下前端性能分析

<head>
  <link rel="stylesheet" href="css/all-normal.css" type="text/css" /></head><body>
  <div id="content"></div>
  <script>
    var content = '';    for(i=1; i<1000000; i++)
        content += '寫入頁面';
    document.getElementById('content').innerHTML = content;  </script>
  <img src="images/ui.png" /></body>

實踐一下前端性能分析

下面通過Chrom的工具查看下:

實踐一下前端性能分析

再來看看ui.png這個請求的詳細情況,可以參考下Google中的文檔,不過需要翻一下才能看到。

實踐一下前端性能分析

Stalled:瀏覽器得到要發(fā)出這個請求的指令,到請求可以發(fā)出的等待時間,一般是代理協(xié)商、以及等待可復(fù)用的TCP連接釋放的時間,不包括DNS查詢、建立TCP連接等時間等。

Request sent:請求第一個字節(jié)發(fā)出前到最后一個字節(jié)發(fā)出后的時間,也就是上傳時間。

Waiting(TTFB) :請求發(fā)出后,到收到響應(yīng)的第一個字節(jié)所花費的時間(Time To First Byte)。

Content Download:收到響應(yīng)的第一個字節(jié),到接受完最后一個字節(jié)的時間,新航道托福就是下載時間。

 

的確出現(xiàn)了延時下載,我將“script”標簽去掉后,看到的確是并行下載的。

實踐一下前端性能分析

 

三、圖像優(yōu)化

平時就會做圖像優(yōu)化,例如制作Sprite圖等。這里是介紹下壓縮圖片。

關(guān)于壓縮的原理,涉及到些算法,可以上網(wǎng)查詢下。

網(wǎng)友Jia在《圖片原理與優(yōu)化》說:

常見的格式中JPG、PNG、GIF亦屬于位圖,所以它們的數(shù)據(jù)結(jié)構(gòu)大致相同,只是每一種圖片格式都有不同的壓縮算法,不同的掃描方式,但是優(yōu)化的方法都有一個共同點,都是圍繞著每個像素顏色值來下手。

1)工具

公司現(xiàn)在開發(fā)都用gulp構(gòu)建工具,里面就有個插件“gulp-image”,用這個工具壓png圖片,能壓掉很多,jpg就不多了。

實踐一下前端性能分析

關(guān)于構(gòu)建工具可以參考《前端自動化構(gòu)建工具gulp記錄

網(wǎng)上還提供很多在線工具,例如國外的tinypng,國內(nèi)的tuhaokuai。

下圖來自于tinypng網(wǎng),國寶熊貓幫我壓縮了54%的質(zhì)量,不過這個網(wǎng)站我上了好久才上去。

實踐一下前端性能分析

 

2)webP

WebP,是一種支持有損壓縮和無損壓縮的圖片文件格式,派生自圖像編碼格式 VP8。

根據(jù) Google 的測試,無損壓縮后的 WebP 比 PNG 文件少了 45% 的文件大小,即使這些 PNG 文件經(jīng)過其他壓縮工具壓縮之后,WebP 還是可以減少 28% 的文件大小。

兼容性方面,Android兼容性較好,畢竟是自己的東西,不過IOS Safrai完全不支持,下圖中顯示中國的瀏覽器已經(jīng)覆蓋到了67.37%。

實踐一下前端性能分析

 

四、iframe

在多年前曾經(jīng)寫過一篇基礎(chǔ)概念的iframe,叫《iframe的一些記錄》。

一直能看到iframe的種種缺點,但是并沒有通過數(shù)據(jù)表達出來,這次用數(shù)據(jù)說明一下。

1)阻塞onload事件

在“Iframes Blocking”這個頁面中,通過iframe加載一個頁面,這個頁面要4秒后才加載完,直接導(dǎo)致的父頁面也要4秒后才能加載成功。

實踐一下前端性能分析

 

2)腳本位于iframe之前

在“Script Before Iframe”這個頁面中,script腳本標簽寫在了iframe之前。

圖中紅色框框中的就是iframe中的內(nèi)容,的確被阻塞了。

實踐一下前端性能分析

后面又試驗了一下將CSS放在iframe之前之后,并不會被阻塞。

實踐一下前端性能分析

 

3)iframe中連接共享

在“Parent and Iframe Connections”這個頁面中,父頁面和iframe中的頁面都包含了5張圖片。

這五張圖片并不是并行下載,而是有先后順序的,紅色方框中的圖片來自于iframe。

實踐一下前端性能分析

 

五、CSS選擇符

下面這些就是CSS選擇符

實踐一下前端性能分析

#toc { margin-left: 20px; }.chapter { font-weight: bold; }A { text-decoration: none; }H1 + #toc { margin-top: 40px; }#toc > LI { font-weight: bold; }#toc A { color: #444; }* { font-family: Arial; }[href="#index"] { font-style: italic; }[title~="Index"] { font-style: italic; }A:hover { text-decoration: underline; }

實踐一下前端性能分析

歸納下來有5種選擇符,元素、關(guān)系、屬性、偽類和偽對象選擇符。

CSS選擇符是從右向左匹配的,在MDN的《編寫高效的 CSS》中介紹了幾種高效CSS指南。

 

1)選擇器測試結(jié)構(gòu)

在“Selector Tests”頁面中有6種寫好的,頁面中1000個那種結(jié)構(gòu)。

1. Baseline設(shè)置了CSS類,但不會匹配

2. Tag就多了個A標簽CSS設(shè)置

3. Class設(shè)置了A中的class屬性

4. Child使用了關(guān)系選擇符中的子選擇符“>”

5. Descendant使用了關(guān)系選擇符中的包含選擇符

6. Universal使用了通配符

實踐一下前端性能分析

<div>
  <div>
    <div> <p> <a id='id0001' class='class0001'>0001</a> </p> </div>
    ...    <div> <p> <a id='id1000' class='class1000'>1000</a> </p> </div>
  </div></div>

實踐一下前端性能分析

 

2)耗時記錄


Baseline

Tag

ClassChildDescendantUniversal
CSS類

.noclass0001 {

  background: #CFD; 

}
...
.noclass1000 {

  background: #CFD;

}

A {

  background: #CFD;  

}
.noclass0001 {

  background: #CFD;

}
...
.noclass1000 {

  background: #CFD;

}

.class0001 {

  background: #CFD;  

}
...
.class1000 {

  background: #CFD;

}

DIV > DIV > DIV > P > A.class0001 {  

  background: #CFD;

}
...
DIV > DIV > DIV > P > A.class1000 {

  background: #CFD;

}

DIV DIV DIV P A.class0001 {  

  background: #CFD;

}
...
DIV DIV DIV P A.class1000 {

  background: #CFD;

}

P.pclass0001 * {

  background: #CFD;

}
...
P.pclass1000 * {

  background: #CFD;

}

耗時

85ms

63ms71ms101ms77ms501ms

耗時

60ms

67ms479ms185ms444ms76ms

耗時

59ms

1116ms64ms73ms67ms54ms

耗時

69ms

62ms68ms67ms62ms83ms

耗時

52ms

63ms68ms78ms68ms77ms

耗時

60ms

62ms72ms87ms67ms81ms

去掉最高和最低后

平均耗時

62ms

63.75ms69.75ms84.75ms69.75ms79.25

 還有一個“create your own”自定義類:

實踐一下前端性能分析

 

還附贈了4個選擇器:“A.class DIV”,“id > A”,“.class [href]”,“DIV:first-child”。


向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI