咱们一起来看看mmkv
腾讯微信团队于2018年9月底宣布开源 MMKV ,原理上基于 mmap的一个高性能key-value 组件,数据的序列化/反序列化使用 protobuf 实现,主打高性能和稳定性,也支持了Android 平台。
**MMKV最新源码托管地址:**https://github.com/Tencent/MMKV
性能对比
我们将 MMKV 和 SharedPreferences、SQLite 进行对比,重复读写操作1万次。发现mmkv读写只需要3-4ms之间结果如下图
(来自官方:测试机器是 Pixel 2 XL 64G,Android 8.1,每组操作重复 1k 次,时间单位是 ms。)
可以看到,MMKV
的读写能力都远好于SharedPreferences
以及SQLite。
大家肯定好奇,MMKV 是如何做到的呢? 这就是下面理解原理了。
咱们先看看传统的
SharedPreferences
&SQLite
是如何存储磁盘的
app运行所在的进程 叫做用户进程,用户进程无法操作磁盘
试想下用户进程直接操作磁盘, 那linux就不是一个安全的系统了,因为linux是以文件为单位的操作系统,正是基于linux文件权限所以android才如此安全
用户进程在读写磁盘时,会将请求先交给内核进程,由内核进程读写磁盘,这就意味着需要切换进程状态而切换进程需要中断CPU 如下图:
传统方式总结: 用户进程切换内核进程比较耗时,当循环写入10000次时,这种耗时累计起来就非常客观了
那MMKV又是如何做的呢
MMKV是基于mmap函数实现的架构
mmap函数是将内存和磁盘建立好映射,一旦映射建立完成,内存上的映射区域的数据,会实时同步到磁盘中这样就节约了频繁切换内核进程造成的耗时
总结: 所以MMKV基本上可以秒杀市面上所有的存储框架了。做IO优化是不错的选择
最近Jetpack 新推出了DataStore 我们又该怎么理解DataStore 和MMKV的区别和用法呢
我们来看DataStore 又解决了什么问题呢?
Preferences DataStore 相比于 mmkv优点
- DataStore 是Google 官方推荐的,可以更好的与 ROOM 配合
- DataStore 与 Flow 更配,更适合 Kotlin/协程的环境
- 对于从SharedPreferences 迁移,更加方便;
- U 线程安全、类型安全等特性;
此外,Jetpack 还提供了 Proto DataStore,见名知意,主要是通过 pb 来做储存持久化,这点和 mmkv 比较类似,pb格式其实在各个大厂数据持久化中都会有涉及。如果现在你对MMKV和Jetpack DataStore还不够了解,现在想要在最短的时间里吃透它,
这里为了大家《Jetpack 全家桶》(内含Compose) 这一套体系的知识点,这里记录比较全比较细致的《Jetpack 入门到精通》(内含Compose) 学习笔记!!! 对Jetpose Compose这块感兴趣的小伙伴也可以参考学习下……
Jetpack 全家桶(Compose)
Jetpack 部分
- Jetpack之Lifecycle
- Jetpack之ViewModel
- Jetpack之DataBinding
- Jetpack之Navigation
- Jetpack之LiveData
Compose 部分
1.Jetpack Compose入门详解
2.Compose学习笔记
3.Compose 动画使用详解