優(yōu)勢

我們通常用的是SP框架,它的get性能是很高的,因為做了內(nèi)存緩存
但是其commit、apply就不盡如人意了
apply會入隊任務(wù),Activity、Broadcast、Service的生命周期會等待隊列清空,引起ANR
很多時候業(yè)務(wù)的實時性要求非常高,commit是必須采用的,但是SP的commit的性能是堪憂的,使用了后可以看到肉眼可見的卡頓
圖中可以看到MMKV和SP寫性能的對比,相差了將近100倍
其次跨進(jìn)程、穩(wěn)定性都做得非常優(yōu)越
所以MMKV非常值得使用
功能簡介
1、mmap
通過mmap映射內(nèi)存文件,提供一塊隨時可寫入的內(nèi)存塊,App可以往里面寫消息,由OS把內(nèi)存寫到文件,不必?fù)?dān)心crash引起的內(nèi)存丟失
僅在操作時映射,mmap只是設(shè)置了文件-虛擬地址的映射,沒有實際分配內(nèi)存,只有實際操作的時候,內(nèi)核會中斷,進(jìn)行內(nèi)存分配、IO操作
2、序列化
采用Protobuf
3、寫優(yōu)化
key-value數(shù)據(jù),會進(jìn)行緩存,每次要寫的時候,往序列化的數(shù)據(jù)的最后增加,保證了最后的數(shù)據(jù)是最新的
為了防止占用空間無限膨脹,在將滿的時候會整合序列化數(shù)據(jù)
4、多進(jìn)程能力
本質(zhì)還是通過mmap實現(xiàn)的多進(jìn)程
5、匿名內(nèi)存
對于隱私數(shù)據(jù),使用Android Ashmem
6、數(shù)據(jù)有效性檢測
考慮到文件系統(tǒng)和OS有不穩(wěn)定性,所以假如crc檢測
7、數(shù)據(jù)加密
通過AES CFB-128算法來進(jìn)行加密
init流程

write流程

read流程

總結(jié)
核心邏輯在C層,直接操作內(nèi)存
1、利用了mmap的特性:內(nèi)存和文件進(jìn)行映射,這樣操作內(nèi)存,可以反應(yīng)到文件上,同時文件被操作,也可以反應(yīng)到內(nèi)存上
這樣就不必調(diào)用read、write了
2、為了優(yōu)化寫效率,不斷往內(nèi)存尾部追加新值,保證尾端是最新的
同時為了避免過度擴(kuò)張,平衡空間與性能,定期整合文件
3、使用Protobuf優(yōu)化序列化能力
這3點是高性能的一部分原因。
多進(jìn)程是通過mmap實現(xiàn)的,mmap天生適合做跨進(jìn)程,Binder也是基于此操作實現(xiàn)的跨進(jìn)程。
可優(yōu)化的點
1、MMKV的get操作未必比SP好,因為它涉及JNI操作,還包含數(shù)據(jù)轉(zhuǎn)型操作。而SP是直接取的內(nèi)存緩存。所以可以在MMKV上封一層,增加內(nèi)存緩存
2、mmap對內(nèi)存消耗很大,就算只有一個字段,占用的內(nèi)存也是4k,對這部分要充分優(yōu)化
后記
有什么寫得錯誤、讓人費解或遺漏的地方,希望可以不吝賜教,我會馬上更改
學(xué)習(xí)自
http://m.itdecent.cn/p/92bcb77f8eca
https://www.cnblogs.com/huxiao-tee/p/4660352.html
可優(yōu)化的點和3個流程圖參考自同事文章