MMKV与SharedPreference的比较(三)

本文对比了Android中SharedPreferences和MMKV的存储机制。SharedPreferences采用XML格式存储,写入涉及两次数据拷贝,适合小批量数据。而MMKV利用mmap进行内存映射,减少拷贝,提高读写效率,其内部使用protobuf进行序列化,确保高性能和稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、SharedPreferences

SharedPreferences 使用 xml 格式为 Android 应用提供一种永久数据存贮方式,xml文件位置一般都在/data/data/包名/shared_prefs目录下,并且使用键值对的方式来存储数据的。适合单进程、小批量的数据存储与访问。

SharedPreferences的特点
读写方式:直接IO
数据格式:XML
写入方式:全量更新

虚拟内存被操作系统划分成两块:用户空间和内核空间,用户空间是用户程序代码运行的地方,内核空间是内核代码运行的地方。为了安全,它们是隔离的,即使用户的程序崩溃了,内核也不受影响。
在这里插入图片描述
写入文件的流程:
1、调用write,告诉内核需要写入数据的开始地址与长度
2、内核将数据拷贝到内核缓存
3、由操作系统调用,将数据拷贝到磁盘,完成写入
可见,将数据写入文件需要将数据拷贝两次,再写入到文件中,如果数据量过大,也会有很大的性能损耗。

二、MMKV

MMKV 是基于 mmap 内存映射的 key-value 组件。

MMAP
Linux通过将一个虚拟内存区域与一个磁盘上的对象关联起来,以初始化这个虚拟内存区域的内容,这个过程称为内存映射(memory mapping)。
对文件进行mmap,会在进程的虚拟内存分配地址空间,创建映射关系。实现这样的映射关系后,就可以采用指针的方式读写操作这一段内存,而系统会自动回写到对应的文件磁盘上。
在这里插入图片描述

MMAP的优势

  • MMAP对文件的读写操作只需要从磁盘到用户主存的一次数据拷贝过程,减少了数据的拷贝次数,提高了文件读写效率。
  • MMAP使用逻辑内存对磁盘文件进行映射,操作内存就相当于操作文件,不需要开启线程,操作MMAP的速度和操作内存的速度一样快。
  • MMAP提供一段可供随时写入的内存块,APP只管往里面写数据,由操作系统如内存不足、进程退出等时候负责将内存回写到文件,不必担心crash导致数据丢失。

Protobuf
protobuf是Google 提供的一个具有高效协议数据交换格式工具库,是一种灵活、高效和自动化机制的结构数据序列化方法。相比XML,有编码后体积更小,编解码速度更快的优势;相比于 Json,Protobuf 有更高的转化效率,时间效率和空间效率都是 JSON 的 3-5 倍。
MMKV底层序列化 / 反序列化使用 protobuf 实现,性能高,稳定性强.

数据结构
在这里插入图片描述
整型编码

  • 1个字节保存7位数据,第1位为标志位。
  • 如果写入的数据 <= 0x7f 那么使用7位即1个字节表示,完成编码。
  • 如果写入的数据 > 0x7f 那么先记录低7位数据,并将最高位设为1,继续执行判断

编码案例

16进制0x7F
10进制127
2进制0111 1111

写入:0111 1111

16进制0xFF00
10进制65280
2进制1111 1111 0000 0000

写入:1000 0000
右移7位:1111 1111 0
写入:1111 1110
右移7位:0000 0011
写入:0000 0011

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值