PB快取資料指南

faywong發表於2016-07-27

概述

在目前客戶端開發中, PB 格式已經是網路傳輸的序列化/反序列化方案的標配。但 PB 同時對我們 native 開發中的快取實現也是有很大價值的。

快取方案對比

本人對比了如下幾種客戶端的快取方案:

  • PB + DiskLruCache
  • Ormlite/Sqlite
  • Gson + DiskLruCache

其中 PB + DiskLruCache 方案與 Gson + DiskLruCache 方案的效能對比如下:

07-25 16:51:51.319 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] json write consume=35
07-25 16:51:51.429 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] json read consume=110
07-25 16:51:51.439 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] pb write consume=10
07-25 16:51:51.489 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] pb read consume=45
07-25 16:52:11.229 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] json write consume=29
07-25 16:52:11.319 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] json read consume=87
07-25 16:52:11.319 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] pb write consume=5
07-25 16:52:11.329 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] pb read consume=6
07-25 16:53:46.259 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] json write consume=36
07-25 16:53:46.329 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] json read consume=72
07-25 16:53:46.339 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] pb write consume=5
07-25 16:53:46.339 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] pb read consume=5
07-25 16:54:14.159 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] json write consume=39
07-25 16:54:14.249 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] json read consume=85
07-25 16:54:14.249 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] pb write consume=5
07-25 16:54:14.259 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] pb read consume=5

實測資料:

json write pb write json read pb read
35 10 110 45
29 5 87 6
36 5 72 5
39 5 85 5

分項加總後:

json write pb write json read pb read
139 25 354 61

可以看出寫操作,pb 所花時間僅佔 json 的18%;讀操作,pb 所花時間僅佔 json 的17%。此外,OrmLite/Sqlite 在效能方面與 json 相當。

使用 PB 快取的正確姿勢

既然好處是明顯的,我們看下如何應用這項新技巧,直接上程式碼:

QueryCommunityResp queryCommunityResp = ...; // 目標繼承自 Message 的PB model 的例項

queryCommunityResp.toByteArray(); // 序列化

final Wire wire = new Wire();

try {
    QueryCommunityResp newResp = wire.parseFrom(queryCommunityResp.toByteArray(), 
            QueryCommunityResp.class); // 反序列化
} catch (IOException e) {
    // TODO: handle exception
}

別忘了新增 api 包依賴:

<dependency>
    <groupId>com.alipay.android.phone.thirdparty</groupId>
    <artifactId>wire-api</artifactId>
    <version>1.5.3</version>
    <scope>provided</scope>
 </dependency>


相關文章