轉(zhuǎn)自 http://www.trinea.cn/android/mobile-performance-optimization/
介紹下針對移動端的網(wǎng)絡(luò)優(yōu)化,不限于 Android,同樣適用于 iOS 和 H5。這篇文章首發(fā)在微信公眾號 codekk。
本文為性能優(yōu)化系列第四篇,目前性能調(diào)優(yōu)專題已完成以下部分:性能優(yōu)化總綱——性能問題及性能調(diào)優(yōu)方式性能優(yōu)化第四篇——移動網(wǎng)絡(luò)優(yōu)化性能優(yōu)化第三篇——代碼優(yōu)化性能優(yōu)化第二篇——布局優(yōu)化性能優(yōu)化第一篇——數(shù)據(jù)庫性能優(yōu)化Android 性能調(diào)優(yōu)工具 TraceView性能優(yōu)化實例
一個網(wǎng)絡(luò)請求可以簡單分為連接服務(wù)器 -> 獲取數(shù)據(jù)兩個部分。其中連接服務(wù)器前還包括 DNS 解析的過程;獲取數(shù)據(jù)后可能會對數(shù)據(jù)進行緩存。
一、連接服務(wù)器優(yōu)化策略
1. 不用域名,用 IP 直連省去 DNS 解析過程,DNS 全名 Domain Name System,解析意指根據(jù)域名得到其對應的 IP 地址。 如 http://www.codekk.com 的域名解析結(jié)果就是 104.236.147.76。
首次域名解析一般需要幾百毫秒,可通過直接向 IP 而非域名請求,節(jié)省掉這部分時間,同時可以預防域名劫持等帶來的風險。
當然為了安全和擴展考慮,這個 IP 可能是一個動態(tài)更新的 IP 列表,并在 IP 不可用情況下通過域名訪問。
2. 服務(wù)器合理部署服務(wù)器多運營商多地部署,一般至少含三大運營商、南中北三地部署。
配合上面說到的動態(tài) IP 列表,支持優(yōu)先級,每次根據(jù)地域、網(wǎng)絡(luò)類型等選擇最優(yōu)的服務(wù)器 IP 進行連接。
對于服務(wù)器端還可以調(diào)優(yōu)服務(wù)器的 TCP 擁塞窗口大小、重傳超時時間(RTO)、最大傳輸單元(MTU)等。
二、獲取數(shù)據(jù)優(yōu)化策略
1. 連接復用節(jié)省連接建立時間,如開啟 keep-alive。
Http 1.1 默認啟動了 keep-alive。對于 Android 來說默認情況下 HttpURLConnection 和 HttpClient 都開啟了 keep-alive。只是 2.2 之前 HttpURLConnection 存在影響連接池的 Bug,具體可見:Android HttpURLConnection 及 HttpClient 選擇
2. 請求合并即將多個請求合并為一個進行請求,比較常見的就是網(wǎng)頁中的 CSS Image Sprites。 如果某個頁面內(nèi)請求過多,也可以考慮做一定的請求合并。
3. 減小請求數(shù)據(jù)大小(1) 對于 POST 請求,Body 可以做 Gzip 壓縮,如日志。
(2) 對請求頭進行壓縮這個 Http 1.1 不支持,SPDY 及 Http 2.0 支持。 Http 1.1 可以通過服務(wù)端對前一個請求的請求頭進行緩存,后面相同請求頭用 md5 之類的 id 來表示即可。
4. CDN 緩存靜態(tài)資源緩存常見的圖片、JS、CSS 等靜態(tài)資源。
5. 減小返回數(shù)據(jù)大小(1) 壓縮一般 API 數(shù)據(jù)使用 Gzip 壓縮,下圖是之前測試的 Gzip 壓縮前后對比圖。

(2) 精簡數(shù)據(jù)格式如 JSON 代替 XML,WebP 代替其他圖片格式。關(guān)注公眾號 codekk,回復 20 查看關(guān)于 WebP 的介紹。
(3) 對于不同的設(shè)備不同網(wǎng)絡(luò)返回不同的內(nèi)容 如不同分辨率圖片大小。
(4) 增量更新需要數(shù)據(jù)更新時,可考慮增量更新。如常見的服務(wù)端進行 bsdiff,客戶端進行 bspatch。
(5) 大文件下載支持斷點續(xù)傳,并緩存 Http Resonse 的 ETag 標識,下次請求時帶上,從而確定是否數(shù)據(jù)改變過,未改變則直接返回 304。
6. 數(shù)據(jù)緩存緩存獲取到的數(shù)據(jù),在一定的有效時間內(nèi)再次請求可以直接從緩存讀取數(shù)據(jù)。
關(guān)于 Http 緩存規(guī)則 Grumoon 在 Volley 源碼解析最后雜談中有詳細介紹。
三、其他優(yōu)化手段
這類優(yōu)化方式在性能優(yōu)化系列總篇中已經(jīng)有過完整介紹1. 預取包括預連接、預取數(shù)據(jù)。
2. 分優(yōu)先級、延遲部分請求將不重要的請求延遲,這樣既可以削峰減少并發(fā)、又可以和后面類似的請求做合并。
3. 多連接對于較大文件,如大圖片、文件下載可考慮多連接。 需要控制請求的最大并發(fā)量,畢竟移動端網(wǎng)絡(luò)受限。
四、監(jiān)控
優(yōu)化需要通過數(shù)據(jù)對比才能看出效果,所以監(jiān)控系統(tǒng)必不可少,通過前后端的數(shù)據(jù)監(jiān)控確定調(diào)優(yōu)效果。
注:服務(wù)器部署方面的優(yōu)化有參考手 Q 和 QZone 去年的技術(shù)分享。
關(guān)注微信公眾號 codekk,回復 perf 可查看 性能優(yōu)化資料匯總