手機淘寶性能優化【分享】

前言

爲了知足不一樣用戶的多樣性購物需求,過去兩年裏手機淘寶的業務不斷膨脹,已經從單一的購物工具成爲了購物內容平臺。在業務快速增加的同時,也帶來一些反作用,不少操做環節和頁面由於承載功能太多,展現速度變慢,用戶等待時間變長,性能優化勢在必行。緩存

 

經過大半年的摸索總結,從實踐中咱們得出了App性能優化的七大策略:性能優化

1.創建監控體系,善用分析工具網絡

2.完善網絡基礎建設,不斷調優框架

3.利用本地緩存,創建離線化異步

4.任務分級,合理並行,主線程移除多餘操做函數

5.業務模塊懶加載工具

6.優化頁面結構和層次性能

7.作好圖片下載緩存工做優化

 

首先是監控體系的創建:根據手機淘寶用戶的操做習慣,咱們對購物主要鏈路進行了劃分,分爲啓動,首頁,搜索,購物車,下單,支付環節,訂單查看等七個環節,每一個步驟和模塊都作到監控,以量化數據爲指導,有的放矢進行優化。ui

對於手機淘寶購物主要鏈路的七個業務環節,本文將抽取三個作重點介紹:啓動、首頁、購物車;而後針對網絡調優,圖片下載緩存兩個基礎能力的優化和如何善用分析工具來作詳細介紹。

 

一.啓動優化

經過線下分析工具,線上灰度數據和代碼review,發現啓動慢主要有三個緣由:

  • 提早引入了許多模塊的初始化;

  • 在主線程,存在耗時的非必要阻塞操做;

  • 部分鎖操做,致使主線程wait時間較長。

 

由此制定出優化的方案:

1)採用優化策略3--利用本地緩存,創建離線化

從用戶點擊圖標到首頁第一次展現,整個過程執行嚴格的無網策略,不作任何網絡交互,全部數據經過緩存或預置的方式獲取。

經過將耗時的網絡IO操做後移,減小了時間開銷。

 

2)採用優化策略4--任務分級,合理並行

將啓動中的全部任務進行梳理和分級,根據級別來調整執行對應任務的時機:

  • 一級:阻塞啓動的任務,好比基礎SDK的初始化,首頁頁面的建立等。

  • 二級:可延遲到首頁加載成功後再執行的任務,好比自動登陸,配置信息和運營數據拉取等。

啓動時只執行一級任務,二級任務延遲到啓動完成後串行執行,一級任務必須沒有鎖操做,保證主線程不會被阻塞。

 

3)採用優化策略5--懶加載

優化前,啓動過程存在不少業務的初始化操做;優化後,採用懶加載策略,真正使用時才進行初始化加載,同時懶加載機制能夠結合緩存或預置數據的方式來達到更好的效果。

 

好比在手機淘寶的五個TAB中,優化前,啓動時會將五個TAB對應的頁面所有建立出來,而實際上只有首頁可見,其餘頁面的建立,包括頁面中業務邏輯的請求發送,都會對整個啓動形成性能損耗。使用懶加載的方式優化後,啓動只建立可見頁面即首頁,其它頁面只在用戶點擊對應TAB時才進行建立顯示,此優化一舉減小了近0.5秒的耗時。

 

在上述三個主要策略的優化指導下,手機淘寶的啓動流程圖調整爲如圖1所示,主線程中啓動階段只保留了必要的初始化,其餘非必要的操做都被懶加載或者異步化。

 

二.首頁優化

 

做爲曝光量最高的頁面,快速打開,穩定可用,及時更新是三大目標。

在首頁,展現的內容大體分爲四類:

  • 二級頁面的入口,圖標,標題和位置相對固定;

  • 頂部的輪播圖,做爲不一樣運營模塊或活動的入口;

  • 根據用戶身份運算出來的推薦商品,店鋪

  • 頂部的消息盒子入口,帶未讀消息數字圖標。

 

不一樣的內容採用不一樣的處理策略:

 

對於第1,2類內容,採用策略3,即進行本地cache化工做,將入口文字圖標緩存在本地。渲染時優先展現上次cache內容,即便遇到無網的狀況,首頁的總體框架頁面和cache過的圖片和文字都能繪製出來。

 

本地cache經過時間戳來保證版本內容的及時更新。

在今年雙十二的活動中,手機淘寶率先推出了圖標運營,經過更新雲端上的配置,待客戶端上前一次cache過時就天然過渡到此版本,給用戶帶來了驚喜。

 

對於第3類內容,採用策略6,優化頁面結構和層次:推薦商品放在頁面最下部,默認不顯示,當用戶滾動上滑時作拉取繪製,避免頁面一次拉取數據內容過多。

 

對於第4類內容則採用策略5,即懶加載,在首屏其餘內容完成基礎繪製後,才調用接口拉取未讀消息數量。

 

此外,首頁數據量相對較大,這些數據的加載,解析,拼裝都是很是耗時的,而目前主流手機都是多核處理器,能夠充分利用多核優點,將這些耗時操做放在異步線程裏完成,保證主線程正常調度。當數據準備完畢,纔在主線程中進行UI的渲染更新,從而保障了主線程的流暢性。

 

三.購物車優化

購物車已經成爲用戶的「第二收藏夾」,用戶經過多終端(PC,手機)不斷更新購物車的內容。在本地創建緩存保存數據,及時展現給用戶是提高打開購物車頁面的必然手段。

但因爲優惠規則和總價計算必須在服務端完成,客戶端在更新購物車時,不但要拉取商品數量的變化,也要拉取總價的變化。

以往是採用主動刷新時全量更新的簡單方法,如今優化爲差量更新,不但流量減小,更有效地提高了拉取和刷新展現的速度。

 

四.網絡優化

上面從三個業務環節講述了優化策略,如今從基礎服務角度來描述優化手段。主幹互聯網傳輸消耗的時間,主要包括三部分:DNS查找、TCP/TLS握手、數據傳輸。如何下降這三部分的耗時是網優的重要手段:

  • IP直連:

自行實現承載在HTTP協議上的DNS解析協議。能節省DNS查找時間,規避傳統DNS可能存在的劫持問題。2013年業界曾經發生過一次公網DNS Server被攻擊,手機淘寶未受任何影響。

  • 創建長鏈接:

經過SPDY實現,減小TCP/TLS握手,下降創建鏈接成本。對於從CDN下載圖片速度幫助很大。

  • 域名收斂:

收斂域名至公司的主力CDN域名。將請求集中在少數幾個域名下,以提升長鏈接的複用率.

  • TCP調優:

無線網絡特色是丟包率高、RT長,針對此特色能夠作針對性的TCP調優。

  • 報文縮減:

逐步由JSON協議向類PB協議轉換。

 

五.圖片方面優化

圖片是電商App使用場景中最多的元素,如何節省流量,快速渲染是電商App都很是關注的。

在創建長鏈接,域名收斂等網絡優化以外,手機淘寶還創建圖片的分級機制:按分辨率,質量,銳化,格式四個緯度,對同一張圖片生成了不一樣組合的衍生文件。

設置了一系列匹配規則,針對不一樣的屏幕,機型,處理能力和網絡環境,配置出合適的圖片大小質量,保證圖片既節省流量又知足用戶視覺體驗。

其中一個經驗是當銳化程度高時,即便圖片質量較低,圖片色彩清晰度也都能讓用戶滿意。


其中一個經驗是當銳化程度高時,即便圖片質量較低,圖片色彩清晰度也都能讓用戶滿意。

 

六.工欲善其事必先利其器

在整個手淘的啓動優化過程當中,系統的工具幫了咱們很大的忙,Android的主要是自帶的 TraceView工具,IOS 主要是Instruments自帶的Time Profiler,System Trace等工具,它們都是數據採集和分析工具,主要用於分析應用程序中的hotspot,都很是強大。工具的具體使用方法不在本文論述範圍內,可是這些工具都提供了程序中的全部線程使用情況,並且線程中的每一次的調用均可以看到具體的堆棧信息、耗時等詳細信息。經過對這些調用的分析,就能夠找到啓動過程當中相對耗時的調用。分析出具體的瓶頸點之後,就能夠有針對性地進行具體優化了。

 

好比 手淘Android啓動階段之前有一個加密存儲的模塊,它會調用系統的SecretKeyFactory.getInstance()方法來生成加密的 key,咱們是經過 TraceView 才發現這個函數調用會耗時300ms 以上,經過 TraceView看裏面的調用堆棧發現它裏面存在鎖操做,因此比較耗時,找到這個瓶頸點以後,手淘Android調研了多種加密存儲方式,最後換了一種比較輕量的加密存儲模塊,優化了該瓶頸點。

 

最後總結七大原則:

1.善用性能分析工具,創建監控體系

2.作好網絡基礎建設和網絡調優

3.離線化,本地緩存

4.懶加載

5.任務分級,合理並行

6.在主線程移除多餘操做

7.簡化合並複雜視圖

相關文章
相關標籤/搜索