微信项目IO优化:Jetpack DataStore 与MMKV实现高效持久化

news2024/11/16 13:47:09

咱们一起来看看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 部分

  1. Jetpack之Lifecycle
  2. Jetpack之ViewModel
  3. Jetpack之DataBinding
  4. Jetpack之Navigation
  5. Jetpack之LiveData

Compose 部分
1.Jetpack Compose入门详解
2.Compose学习笔记
3.Compose 动画使用详解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/700753.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mybatis【核心配置文件说明】

配置解析 1、核心配置文件 mybatis-config.xml 注意: 在配置 mybatis-config.xml 时,要注意标签的顺序: 2、环境变量(environments) MyBatis 可以配置成适应多种环境 不过要记住:尽管可以配置多个环境…

现代操作系统(下)

第六章 死锁 在计算机系统中有很多独占性的资源,在任一时刻它们都只能被一个进程使用。两个进程同时使用同一文件系统表中的表项会引起文件系统的瘫痪。正因为如此,操作系统都具有授权一个进程(临时)排他地访问某一种资源的能力。…

【AcWing】夏季每日一题2023 -- 4382. 快速打字 -- Java Version

题目链接:https://www.acwing.com/problem/content/4385/ 1. 题解(4382. 快速打字) y总视频讲解:https://www.acwing.com/video/4743/ 类似题目:AcWing 2816. 判断子序列 1.1 双指针:判断子序列 ⭐ 时间复…

一文吃透MAUI、WinUI3和WPF的优势及劣势

引言: 在应用程序开发领域,选择合适的框架对于开发人员和业务来说至关重要。本文将比较并对比三个流行的用户界面框架:MAUI(Multi-platform App UI)、WinUI 3和WPF(Windows Presentation Foundation&#x…

element ui table表格(表头、表体)样式

效果图如下 1.表头样式:header-cell-stayle 2.表体样式 在methods中写 在style中

使用Qt/C++实现WGS84、高德GCJ-02、百度BD-09坐标系间相互转化

在做地图相关开发时候,绕不开不同坐标系间的转化,因此我根据查阅相关资料后将不同坐标系间的转换封装到一个GeoTranslate类中,该类转换函数不仅支持Qt/C调用,同时可在QML中直接调用,配合上QML/Map很方便,我…

大咖培训讲座|高性能计算专场 认识真正的高性能计算,探究如何成为高性能计算工程师 ...

猿代码科技高性能计算讲座原文——OpenBLAS创始人无保留分享 我们如何成为一个高性能计算的工程师,或者这种性能优化的这一部分的软件工程师。 我其实想了一下,这一部分的入门的基础其实没那么难。 就是更主要的话,我还是在于兴趣和自驱力…

idea自定义类注释以及方法注释,无警告

背景 idea:IntelliJ IDEA 2023.1.3 (Ultimate Edition) 效果 类 方法 正式:类 设置 代码 /** * author: 你的名字* date: ${DATE} on ${TIME}* desc: $NAME*/注意,请全部复制,空行也要,看设置截图选中部分 …

Jenkins定时执行JMeter脚本并查看测试报告实现

【整体思路】 通过Tomcat启动Jenkins服务,在Jenkins中创建自动化测试项目,项目配置中配置构建时执行的动作,配置构建后动作展示报告 【涉及软件及版本信息】 Tomcat版本:9.0.76 Jenkins版本:2.332.3(注…

ES批量上传数据 - Python操作ES

代码 # -*- coding: utf-8 -*- # Author : markadcimport randomfrom elasticsearch import Elasticsearch, helpersurl http://localhost:9200/ client Elasticsearch(url) index testsome [] for i in range(1, 10001):docu {uid: i, age: random.randint(1, 100)} …

ChatGPT中的Token:了解聊天模型的基本单位

✍创作者:全栈弄潮儿 🏡 个人主页: 全栈弄潮儿的个人主页 🏙️ 个人社区,欢迎你的加入:全栈弄潮儿的个人社区 📙 专栏地址:AI大模型 ChatGPT中的Token是什么? 在ChatGPT…

23-BOM和常见的BOM对象

一、是什么 BOM (Browser Object Model),浏览器对象模型,提供了独立于内容与浏览器窗口进行交互的对象 作用:跟浏览器做一些交互效果, 如何进行页面的后退,前进,刷新,浏览器的窗口发生变化&am…

ECS云服务器U实例评测,可以免费体验哦

目录 一、ECS云服务器U实例介绍 话题一、U实例使用体感如何,是否和主售型实例有区别,具体体现在哪里? 话题二、结合相关数据材料,对您感兴趣的场景 话题三、使用u实例是否为您的云上业务或者测试项目提供了帮助支持&#xff1…

Axure教程——表格内部修改

本文介绍的时用Axue中的中继器制作表内修改效果 效果 预览地址:https://w97xns.axshare.com 功能 点击某条数据的”编辑“按钮可以修改此条数据的每项数据,”编辑“和”删除“按钮变为”保存“和”取消‘按钮 制作 需要的元件:矩形、中继…

asp.net MVC

文件目录 页面 HTML与Script的联系 HTML元素通过调用脚本中的function来触发前端的动作要进行的后端逻辑操作 Script中通过选择器$(“#str”)来改变前端HTML的显示数据 Script中有两种类型的函数模式 $(function(){ … }) :window.onload时调用。function btnRese…

​Chamilo 学习管理软件存在命令执行漏洞(CVE-2023-34960)

Chamilo 学习管理软件存在命令执行漏洞(CVE-2023-34960) 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责&#xff…

Python基础语法笔记整理(黑马8天学会python笔记)

Python 第一章、基础语法 01.字面量(写在代码中的固定的值) 02.注释 # 单行注释 """ 多行注释 """03.变量 变量无类型,数据有类型 变量名 变量值04.数据类型 数据类型: type()05.类型转换 字符串转数字&#xff…

【unity实战】制作一个类帝国时代、红警——RTS战略性游戏

文章目录 先来看看实现的最终效果什么是RTS游戏一、两种方法实现相机的移动旋转缩放以及拖拽功能前言准备第一种办法1. 移动1.1 代码实现,里面都写了详细的中文注释,就不过多解释了1.2 效果:1.3 问题: 2. 缩放2.1 代码 3. 限制范围…

Linux内核TCP参数调优全面解读

Linux内核TCP参数调优全面解读 前言 TCP 性能的提升不仅考察 TCP 的理论知识,还考察了对于操心系统提供的内核参数的理解与应用。 TCP 协议是由操作系统实现,所以操作系统提供了不少调节 TCP 的参数。 如何正确有效的使用这些参数,来提高 T…

微前端框架MicroApp入门学习笔记(一)

1、简介 微前端是一种架构风格,旨在通过将前端应用程序拆分为更小、更可管理的部分,使多个团队能够独立开发、部署和维护这些部分,从而实现前端的可扩展性和可维护性。   MicroApp框架是京东出品的一种用于构建微前端架构的开源框架&#x…