Android-性能优化-07- 存储优化-MMKV-基础

66 阅读3分钟

数据持久化

MMKV

github.com/Tencent/MMK…

MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。从 2015 年中至今在微信上使用,其性能和稳定性经过了时间的验证。近期也已移植到 Android / macOS / Windows 平台,一并开源。

image.png

SharedPreference

image.png

image.png

读写方式:直接I/O

数据格式:xml

写入方式:全量更新

读写方式

I/O

虚拟内存被操作系统划分成两块:用户空间和内核空间,用户空间是用户程序代码运行的地方,内核空间是内核代码运行的地方。为了安全,它们是隔离的,即使用户的程序崩溃了,内核也不受影响。

image.png

写文件流程:

1、调用write,告诉内核需要写入数据的开始地址与长度

2、内核将数据拷贝到内核缓存

3、由操作系统调用,将数据拷贝到磁盘,完成写入

MMAP

Linux通过将一个虚拟内存区域与一个磁盘上的对象关联起来,以初始化这个虚拟内存区域的内容,这个过程称为内存映射(memory mapping)。

image.png

对文件进行mmap,会在进程的虚拟内存分配地址空间,创建映射关系。实现这样的映射关系后,就可以采用指针的方式读写操作这一段内存,而系统会自动回写到对应的文件磁盘上

MMAP优势

• MMAP对文件的读写操作只需要从磁盘到用户主存的一次数据拷贝过程,减少了数据的拷贝次数,提高了文件读写效率。

•MMAP使用逻辑内存对磁盘文件进行映射,操作内存就相当于操作文件,不需要开启线程,操作MMAP的速度和操作内存的速度一样快;

• MMAP 提供一段可供随时写入的内存块,App 只管往里面写数据,由操作系统如内存不足、进程退出等时候负责将内存回写到文件,不必担心 crash 导致数据丢失。

• MMAP 防止数据丢失,提高读写效率;

• 精简数据,以最少的数据量表示最多的信息,减少数据大小;

• 增量更新,避免每次进行相对增量来说大数据量的全量写入。

image.png

微信 Mars :

mp.weixin.qq.com/s/kDPTt9Rtd…

美团 Logan :

tech.meituan.com/2018/02/11/…

防止数据丢失并提升了读写效率。

数据结构

image.png

image.png

编码案例

image.png

整型编码

1个字节保存7位数据

如果写入的数据 <= 0x7f 那么使用7位即1个字节表示。

如果写入的数据 > 0x7f 那么先记录低7位数据,并将最高位设为1,继续执行判断

image.png

写入方式

image.png

扩容

扩容非常简单,只需要重新设定文件大小,然后重新mmap映射即可

//重新设定文件大小

ftruncate(m_fd, m_size);

//解除映射

munmap(m_ptr, oldSize);

//重新映射

m_ptr = (int8_t *) mmap(m_ptr, m_size, PROT_READ | PROT_WRITE, MAP_SHARED, m_fd,0);