Android第三方框架 -- 淺談MMKV (一)

前言

最近想把項目中使用過的第三方框架總結(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)。


image

更多關(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容