經過QQ瀏覽器內核看browser性能優化


內容來源:2017年6月24日,騰訊前端高級工程師凌實在「騰訊Web前端大會 TFC 2017 」進行《從瀏覽器內核看性能優化》演講分享。IT大咖說做爲獨家視頻合做方,經主辦方和講者審閱受權發佈。
閱讀字數:2742 | 6分鐘閱讀


摘要

QQ瀏覽器內核架構組負責人,經過QQ瀏覽器X5內核在加載速度、流暢度方面所作的優化工做,帶你瞭解瀏覽器內核的工做原理、展現前端優化的指導性原則、以及更佳的優化方向。而且揭露一些影響瀏覽器性能但鮮爲人知的技術內幕,並對Mobile Web場景下瀏覽器內核後續的優化方向和新特性進行展望。html

嘉賓演講視頻地址:t.cn/Rp0Ca4K前端

PPT地址:android

背景

騰訊瀏覽服務(TBS)

騰訊瀏覽服務是將X5內核進行深刻整合,用一個應用或一個小的SDK就能夠將X5內核集成到APP中的能力。這對於X5內核在安全性、穩定性和HTML5能力加強方面有很強優點。web

目前咱們的X5內核已經在微信、QQ等公司內外超過1000個APP上被使用,內核覆蓋度超過97%。chrome

內核演進


X5內核最先是在QQ瀏覽器中集成和推出的。早在android2.二、2.3時代就推出了自有的內核。這個內核一方面主要是解決各類加載、渲染性能問題,另外一方面也是但願推進優化方面的一些體驗,以此不斷完善瀏覽體驗的過程。canvas

到了android4.2的時候,JB版本內核作了一個升級,支持了硬件加速,內核性能獲得了較大提高。這個內核仍是基於傳統的Webkit內核。小程序

在去年年初的時候,咱們將總體內核架構切換到了Blink內核上,後來還在不斷加快內核的迭代。目前你們在線上使用的是基於Blink m53的版本。咱們但願經過不斷的版本迭代和性能優化來推進業務的發展,減小用戶在業務上遇到的問題,同時應用到最新的內核能力。微信小程序

內核須要作哪些優化

對於一個頁面,咱們要從網絡上把頁面加載下來,對它進行解析排版,最後渲染。瀏覽器

咱們要求頁面加載速度要快,給用戶愉快的體驗,使用戶更好地去消費產品。緩存

頁面交互要流暢地完成,也是內核須要作的一個重點工做。

網頁加載優化

網頁加載特色

網頁加載一般爲突發的大小量文件下載。網頁的加載速度隨着帶寬的增長,在一開始時會有所提高;到後來不管帶寬提高到多少,加載速度都不會有明顯提高。

在加載一個文件或資源的時候,延遲和頁面加載速度是線性的關係。延遲越低,加載速度也會變得越低。

內核所要作的優化就是下降頁面在加載過程當中,每一個鏈接請求、每次內核工做的延遲。

頁面加載速度優化指標

頁面加載速度「快」實際上是用戶主觀體驗,通過一些摸索,咱們定義瞭如下指標:

一、首字——頁面最初有內容的時候。

二、首屏——頁面鋪滿全屏的狀態。

三、所有完成時間。

目前重點關注的是首屏鋪滿時間,首屏鋪滿時間越快,用戶體驗越好。

加載速度優化

儘快加載資源,減小內核、網絡加載資源延遲。

網絡層優化:

DNS緩存:DNS是一個比較耗費時間的階段,若是能把DNS緩存作得更好,就能大範圍減小鏈接的延遲。

資源Socket併發控制、預鏈接:經過Socket併發控制和預鏈接技術,一方面提高Socket重用率,另外一方面也是讓Socket鏈接保持活躍狀態。這樣就可讓頁面在加載過程當中保持高速狀態。

資源優先級:咱們但願在首屏內的資源能夠快速加載下來,首屏外的資源優先級能夠低一些,日後作一些延遲。

透明代理:透明代理主要是爲了解決在移動網絡下不一樣運營商環境以及CDN部署不合理出現的一些狀況,避免帶來很大的網絡延遲。經過後臺合理的透明代理,能夠解決這些不合理的應用狀況,優化總體延遲。在終端上咱們主要作的是在協議方面的協議優化。最先咱們用的是HTTP的透明代理,後來改用了SPDY,目前也在嘗試HTTP2,將來也可能去嘗試最新的QUIC。

優化效果


如圖是未經優化的網絡和通過了優化的網絡對比。能夠看到未經優化的時候每一個鏈路請求都會比較長,用戶的併發性並非很好,總體耗時長。

優化後每一個鏈路的鏈接時間或解析時間會減小,大部分時間都是下載資源的時間,鏈接請求都處於併發狀態,這樣是最有利於用網絡進行加載的。

前端推薦工具

PageSpeedInsight和Webpage Test這兩個工具能夠幫助你們定位本身的站點在加載方面有哪些性能問題,甚至能爲CDN不合理的方面提供一些建議。我建議你們能夠利用這些工具去衡量本身頁面的加載速度方面是否有更多的優化空間。


在內核的發展過程當中,根據咱們對行業的觀察來看,目前在Hybrid APP發展較快的狀況下,不少時候並不支持加載一個網頁,而是把頁面當成APP的表現形式去展現。

內核後續優化方向

在Hybrid APP階段,對加載速度提出了更高的要求。

更加貼近Native APP的加載方式。


基於ServiceWorker的加載

容許APP提早將業務的資源放入到內核緩存,跳過shouldInterceptRequest,手機QQ上的個別業務上首屏性能有25%左右的提高。

首屏標籤

在首屏位置插入首屏標籤,內核解析到首屏標籤當即停止解析並排版和上屏。

  1. <html>

  2. <meta name=」x5-pagetype」 content=」optpage」>

  3. <body>

  4. <first-screen/>

  5. </body>

    </html>

關鍵子資源緩存

關鍵子資源是影響首屏性能的關鍵(阻塞)資源。

咱們但願在事先就能知道頁面有哪些關鍵的子資源是會阻塞它的加載進程。目前內核經過統計的方式去看用戶經常使用的子資源有哪些,並將這些子資源加入預緩存名單。以後在Web的規範化方面也會作更多突破。

頁面渲染優化

頁面交互優化

頁面交互的流暢涉及到頁面的滾動、縮放,頁面上動畫的播放是否流暢,是否能快速響應交互。

如何作到流暢

在渲染過程當中,渲染速度受多種條件制約,渲染管線各階段耦合緊密。

內核要想優化渲染的過程,要解耦渲染管線,讓渲染管線之間沒有太強的聯繫,避免重複繪製。

當前的渲染架構


內核會經過硬件加速和圖層混合來減小渲染的節點或任務。圖層混合就是把一些相關的元素放在同一層,非相關的元素放在另外的層去彙總。

優勢

Layer的內容變化,只須要更新所屬的GraphicsLayer的緩存便可。

CPU繪製內容,GPU混合GraphicsLayer。

分層依據:CSS Transform&Opacity、Fixed、Overflow-scroll、特殊元素(canvas、webgl)。

如何分層纔是渲染最優?

分層的目的主要是減小重繪,當元素有位置變化時適合分層。

雖然分層可以減小瀏覽器的重繪,可是物極必反。分層太多會致使瀏覽器遍歷和計算的耗時變長,分層面積過大會致使渲染所用內存增大。

可視區域內分層太多且須要繪製面積太大,渲染性能很是差,甚至達到沒法正確顯示的地步。

靜止的元素周圍的內容頻繁變化的元素須要單獨分層。

分層原則

分層原則是減小渲染重繪面積與減小分層個數和分層總面積。

元素只有相對位置變化的須要分層。

元素更新頻繁須要分層。

較長較大的頁面注意總的分層個數。

避免某一塊區域分層過多,面積過大。

後續展望

Web發展趨勢

HybridAPP和Web APP對於Web發出了新的挑戰。如今的頁面再也不是網頁,而是變成一個真正由APP承載的界面。

前端有不少框架來優化性能。

在終端,最近比較火的是微信小程序架構,Google也在推廣他們的Progressive Web APP架構,也是爲了解決在新的挑戰下Web所遇到的瓶頸。

內核會經過性能提高和更豐富的能力擴展來進行優化。


這是Google對於內核發展方向給出的簡要示意圖。

之後你們使用的不是單一的內核狀態,而是把內核的加載、網絡渲染甚至js引擎,均可以做爲一個獨立的service對Web提供服務的能力。經過解耦讓Web獲得更多能力的擴充。

WebAssembly

Chrome、Firefox、Safari、Edge共同推進定製的一套標準。2017年2月28日,一致宣佈MVP版本完成,chrome M57和iOS 11支持。

執行效率方面更高效。執行效率約是JavaScript的2-3倍,Native的60%以上。

WebAssembly與JavaScript可互相調用,並支持C/C++編碼。

WebAR


VR是一個新的領域,不管是資源仍是使用過程都存在一些問題,也期待你們一塊兒嘗試探討,怎樣推進VR的實際使用。

我今天的分享就到這裏,感謝聆聽!

相關文章
相關標籤/搜索