
MMKV:主要是效率,比Sp效率高
DataStore:主要是穩(wěn)定性
Sp原理分析
數(shù)據(jù)格式:XML格式保存
初始化:子線程使用IO讀取整個文件,進(jìn)行XML解析,存入內(nèi)存Map集合
保存:commit同步提交,阻塞主線程;apply異步提交 ,無法獲取結(jié)果且可能數(shù)據(jù)丟失
更新:把Map中的數(shù)據(jù),全部序列化為XML,覆蓋文件保存即全量更新
優(yōu)化方向:
比XML更精簡的數(shù)據(jù)格式
更高效的文件處理
更優(yōu)的數(shù)據(jù)更新方式即局部更新
MMKV
基于mmap
傳統(tǒng)I/O
虛擬內(nèi)存被操作系統(tǒng)劃分為兩塊:用戶空間和內(nèi)核空間,用戶空間是用戶程序代碼運行的地方,內(nèi)核空間是代碼運行的地方,內(nèi)核空間由所有進(jìn)程共享。為了安全,它們是隔離的,即使用戶的程序崩潰了,內(nèi)核也不受影響
寫文件流程:
1、調(diào)用write向內(nèi)核發(fā)起系統(tǒng)調(diào)用,上下文從用戶態(tài)切換為內(nèi)核態(tài)
2、CPU將用戶緩沖區(qū)中的數(shù)據(jù)拷貝到內(nèi)核空間的緩沖區(qū)(CPU拷貝)
3、CPU利用DMA控制器將數(shù)據(jù)從內(nèi)核緩沖區(qū)拷貝到磁盤緩沖區(qū)進(jìn)行數(shù)據(jù)傳輸(DMA拷貝)Direct memory access
4、上下文從內(nèi)核態(tài)切換回用戶態(tài),write系統(tǒng)調(diào)用執(zhí)行返回
MMAP
Linux通過將一個虛擬內(nèi)存區(qū)域與一個磁盤上的對象關(guān)聯(lián)起來,以初始化這個虛擬內(nèi)存區(qū)域的內(nèi)容,這個過程稱為內(nèi)存映射(memory mapping)
數(shù)據(jù)直接拷貝到用戶空間的映射區(qū)域

對文件進(jìn)行mmap,會在進(jìn)程的虛擬內(nèi)存分配地址空間創(chuàng)建映射關(guān)系
實現(xiàn)這樣的映射關(guān)系后,就可以采用指針的方式讀寫操作這一段內(nèi)存,而系統(tǒng)會自動回寫到對應(yīng)的文件磁盤上
MMAP優(yōu)勢
MMAP對文件的讀寫操作只需要從磁盤到用戶主存的一次數(shù)據(jù)拷貝過程,減少了數(shù)據(jù)的拷貝次數(shù),提高了文件操作效率
MMAP使用邏輯內(nèi)存對磁盤文件進(jìn)行映射,操作內(nèi)存就相當(dāng)于操作文件,不需要開啟線程,操作MMAP的速度和操作內(nèi)存的速度一樣快
MMAP提供一段可供隨時寫入的內(nèi)存塊,APP只管往里面寫數(shù)據(jù),由于操作系統(tǒng)如內(nèi)存不足、進(jìn)程退出等時候負(fù)責(zé)將內(nèi)存回寫到文件