前言
最近想把項目中使用過的第三方框架總結(jié)下,其中覺得比較好的推薦給大家。其中MMKV是必須要提到的一個庫。
之前項目中在輕量級存儲上使用的是 SharedPreferences, 雖然 SP 兼容性極好, 但 SP 的低性能一直被詬病, 線上也出現(xiàn)了一些因為 SP 導(dǎo)致的 ANR。雖然對SP網(wǎng)上也有很多優(yōu)化方案,但是一個是28之后Android對反射的監(jiān)管越來越嚴。而一個就算優(yōu)化后的SP還是和MMKV有一些差距。不過當(dāng)然有些少數(shù)情況下,也還是可以繼續(xù)使用SP。
微信團隊對MMKV的介紹,多多給他們star
MMKV 原理
MMKV for Android 多進程設(shè)計與實現(xiàn)
一、集成與指南
MMKV 已托管到 bintray(JCenter),可以直接使用。在 App 的 build.gradle 里加上依賴:
Maven集成方式
dependencies {
implementation 'com.tencent:mmkv:1.0.10'
}
使用指南
MMKV 的使用非常簡單,所有變更立馬生效,無需調(diào)用 sync、apply。
初始化
// 設(shè)置初始化的根目錄
String dir = getFilesDir().getAbsolutePath() + "/mmkv_2";
String rootDir = MMKV.initialize(dir);
Log.i("MMKV", "mmkv root: " + rootDir);
MMKV 提供一個全局的實例,可以直接使用:
import com.tencent.mmkv.MMKV;
//……
MMKV kv = MMKV.defaultMMKV();
kv.encode("bool", true);
boolean bValue = kv.decodeBool("bool");
kv.encode("int", Integer.MIN_VALUE);
int iValue = kv.decodeInt("int");
kv.encode("string", "Hello from mmkv");
String str = kv.decodeString("string");
SharedPreferences 遷移
private void testImportSharedPreferences() {
MMKV mmkv = MMKV.mmkvWithID("myData");
SharedPreferences old_man = getSharedPreferences("myData", MODE_PRIVATE);
// 遷移舊數(shù)據(jù)
mmkv.importFromSharedPreferences(old_man);
// 清空舊數(shù)據(jù)
old_man.edit().clear().commit();
......
}
二、MMKV 性能測試
我們將 MMKV 和 SharedPreferences、SQLite 進行對比, 重復(fù)讀寫操作 1k 次。相關(guān)測試代碼在 Android/MMKV/mmkvdemo/。結(jié)果如下圖表。
1.單進程性能
可見,MMKV 在寫入性能上遠遠超越 SharedPreferences & SQLite,在讀取性能上也有相近或超越的表現(xiàn)。
更多關(guān)于性能測試的關(guān)注wiki
三、MMKV 和SP的性能差距原因
1.MMKV使用了protobuf作為序列化的數(shù)據(jù)結(jié)構(gòu),相比json和xml效率更快,空間占用更低。深入 ProtoBuf - 簡介
2.使用了mmap和匿名Ashmem共享內(nèi)存,減少了用戶空間數(shù)據(jù)到內(nèi)核空間的拷貝。
3.需要磁盤空間替換內(nèi)存空間時,就可以使用MMKV
4.支持多進程,多進程安全
四、MMKV 的缺點
1.在某些情況下讀操作會比SP慢(查詢數(shù)據(jù)時存在ProtocolBuffer解碼;首次實例化會進行數(shù)據(jù)的復(fù)寫剔除重復(fù)數(shù)據(jù))
2.在隨機寫很多的情況下,會導(dǎo)致隨機IO操作,導(dǎo)致效率下降。
3.不建議太大文件數(shù)據(jù)存儲,會比較快消耗虛擬內(nèi)存。盡量保證每一個文件存儲的數(shù)據(jù)較小。
4.可以適當(dāng)?shù)臅r候釋放一部分內(nèi)存數(shù)據(jù),在不需要使用的時候,最好把MMKV給close掉。甚至調(diào)用exit方法。
最后
第一篇只是簡單介紹MMKV的性能和基本使用,主要是為了讓大家直觀的認識到它的性能的強大性。下一篇開始我們開始關(guān)注MMKV的源碼。
參考
https://juejin.im/post/6844903914119102472#heading-2
https://wongwoo.blog.csdn.net/article/details/106520415
http://www.itdecent.cn/p/c12290a9a3f7