首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

SharedPreferences VS MMKV

2.1 Memory Mapping 内存映射 Memory Mapping 简称 MMap 是一种将磁盘上文件一部分整个文件映射到应用程序地址空间一系列地址机制,从而应用程序可以用访问内存方式访问磁盘文件...由此可见,MMap 优势很明显了,因为进行了内存映射,操作内存相当于操作文件,无需开启线程,相较于 I/O 对文件读写操作只需要从磁盘到用户主存一次数据拷贝过程,减少了数据拷贝次数,提高了文件操作效率...protobuf 在更新文件时,虽然也不方便局部更新,但是可以做增量更新,即不管之前是否有相同 key,一旦有数据便添加文件最后,待最终文件读取时,后面数据会覆盖之前老旧数据;...当添加数据时文件大小不够了,需要全量更新,此时需要将 Map 中数据按照 MMKV 方式序列化,滤重后保存需要字节数,根据获取字节数与文件大小进行比较;若保存后文件大小可以添加数据时直接添加在最后面...,若保存后文件大小还是不足以添加数据时,此时需要对 protobuf * 2 扩容; protobuf 功能简单,作为二进制存储,可读性较差;同时无法表示复杂概念,通用性相较于 xml 较差;

47381

SharedPreferences VS MMKV

Memory Mapping 简称 MMap 是一种将磁盘上文件一部分整个文件映射到应用程序地址空间一系列地址机制,从而应用程序可以用访问内存方式访问磁盘文件; [6o252k3np7...,因为进行了内存映射,操作内存相当于操作文件,无需开启线程,相较于 I/O 对文件读写操作只需要从磁盘到用户主存一次数据拷贝过程,减少了数据拷贝次数,提高了文件操作效率;同时 MMap 只需要提供一段内存...,只需要关注往内存文件中读写操作即可,在操作系统内存不足进程退出时自动写入文件中;       当然,MMap 也有自身劣势,因为 MMap 需要提供一度长度内存块,其映射长度默认是一页,即...,虽然也不方便局部更新,但是可以做增量更新,即不管之前是否有相同 key,一旦有数据便添加文件最后,待最终文件读取时,后面数据会覆盖之前老旧数据;       当添加数据时文件大小不够了...,需要全量更新,此时需要将 Map 中数据按照 MMKV 方式序列化,滤重后保存需要字节数,根据获取字节数与文件大小进行比较;若保存后文件大小可以添加数据时直接添加在最后面,若保存后文件大小还是不足以添加数据时

90961

你真的懂SharedPreferences

() 都会创建一个 EditorImpl 对象,当修改或者添加数据时会将其添加到 EditorImpl mModifiled 容器中,通过 commit apply 提交后会比较 mModifiled...进程再次启动后如果发现该 SharedPreferences 存在 Backup 文件,就将 Backup 文件重名为源文件,原本未完成写入文件就直接丢弃,这样最多也就是未完成写入数据丢失,它能保证最后一次落盘...也正式这个 BackUp 机制,导致多进程可能会丢失写入数据。但也不是只有多进程场景才会发生数据丢失情况。...9.SharedPreferences优化可以引申出来mmkv实现原理 MMKV 是基于 mmap 内存映射 key-value 组件,底层序列化/反序列化使用 protobuf 实现,Linux...MMAP优势 1.MMAP对文件读写操作只需要从磁盘到用户主存一次数据拷贝过程 2.MMAP使用逻辑内存对磁盘文件进行映射,操作内存就相当于操作文件,不需要开启线程,操作MMAP速度和操作内存速度一样快

40620

让源码告诉你:Android 不要滥用 SharedPreferences(上)

SharedPreferences 使用不当可能引发“严重后果”以及该如何正确使用 SharedPreferences。...) { if (mSharedPrefsPaths == null) { //mSharedPrefsPaths维护文件名name和文件File 映射关系...,这里主要维护了 SharedPreferences 文件名 name 和文件 File 映射关系,既根据文件名 name 得到文件 File,每个 Activity 都会包含一个 ContextImpl...其实不难分析出 commitToMemory 方法主要工作是:前面我们一系列 putXxx() remove() 操作都会添加到 mModified 临时容器中,mModified 保留着我们当前改变...每当我们 edit 都会创建一个 EditorImpl 对象,当修改或者添加数据时会将其添加到 EditorImpl mModifiled 容器中,通过 commit apply 提交后会比较

90220

Android基础总结(5)——数据存储,持久化技术

不对存储内容做任何格式化处理,所有数据都是原封不动地保存到文件中。因此,这种方式比较适合存储一些文本数据二进制数据。...,而MODE_APPEND则表示如果该文件已经存在,则将内容追加到原文件内容后面。...SharedPreferences.Editor对象editor 向上一步获取SharedPreferences.Editor对象中添加数据,比如添加一个boolean型数据就使用editor.putBoolean...,第二个一般直接传入null即可,第三个参数是一个ContentValues对象,它提供了一系列put()方法重载,用于ContentValues对象中添加数据,只需将表中每个列名以及相应添加数据传入即可...第一个参数就是表名,第二个是要更新数据组装成ContentValues对象,第三个和第四个参数用于约束更新某一某几行数据,不指定的话是默认更新所有

1.2K70

MMKV为什么可以替换SharedPreferences

通过 mmap 内存映射文件,提供一段可供随时写入内存块,App 只管往里面写数据, 由操作系统负责将内存回写到文件,不必担心 crash 导致数据丢失。...4.空间增长 使用 append 实现增量更新带来了一个问题,就是不断 append 的话,文件大小会增长得不可控。我们需要在性能和空间上做个折中。...可见,MMKV 在写入性能上远远超越 SharedPreferences & SQLite,在读取性能上也有相近超越表现。 2.多进程性能 ?...2.mmap 通过mmap来访问文件,mmap()将文件直接映射到用户空间,文件在mmap时候,内存并未真正分配, 只有在第一次读取/写入时候才会触发,这个时候,会引发缺页中断,在处理缺页中断时候...然后调用ByteBufferput方法添加数据。

2.4K10

【面试黑洞】Android 键值对存储有没有最优解?

一个官方发布、更(gèng)库,性能竟然比不过比它早两年发布、第三方库。而且我们能看到,更离谱是,它甚至还比不过 SharedPreferences 。...它可以让系统为你指定文件开辟一块专用内存,这块内存和文件之间是自动映射、自动同步关系,你对文件改动会自动写到这块内存里,对这块内存改动也会自动写到文件里。...而且这个内存映射还有一点很方便是,虽然这块映射内存不是实时对应文件写入数据,但是它在程序崩溃时候,并不会随着进程一起被销毁掉,而是会继续有条不紊地把它里面还没同步完内容同步到它所映射文件里面去...不管是用户打开聊天页面,还是滑动聊天记录来查看聊天历史,用内存映射方式都可以既实时写入所有即将被渲染文字,又不会造成界面的卡顿。...对于这种文件损坏,SharedPreferences 和 DataStore 应对方式是在每次写入数据之前都对现有文件做一次自动备份,这样在发生了意外出现了文件损坏之后,它们就会把备份数据恢复过来

1.2K20

通用缓存存储方案设计

缓存容量,就是缓存大小每一种缓存,总会有一个最大容量,到达这个限度以后,那么就须要进行缓存清理了框架。这个时候就需要删除一些旧缓存并添加缓存。...当缓存满了之后,再想其添加缓存,这个时候就需要删除一些旧缓存并添加缓存。这个跟线程池满了以后线程处理策略相似!...DataStore:旨在替代原有的 SharedPreferences,支持SharedPreferences数据迁移Room/Realm/GreenDao:支持大型复杂数据集图片其他开源缓存库ACache...它有一些弊端如下所示对文件IO读取,因此在IO上瓶颈是个大问题,因为在每次进行get和commit时都要将数据从内存写入到文件中,文件中读取。...它设计初衷是轻量级,建议当存储文件中key-value数据超过30个,如果超过30个(这个只是一个假设),则开辟一个文件进行存储。

89510

Android开发中Kotlin扩展函数技巧!

在Kotlin中,扩展函数是一种非常有用功能,可以让我们现有的类添加功能,而无需修改类源代码。在本文中,我们将探讨Kotlin扩展函数原理和运用,以及如何在Android开发中使用它们。...扩展函数是Kotlin中一种特殊函数,它允许我们一个类添加函数,而无需继承修改这个类源代码。扩展函数语法非常简单,只需要在函数名前面加上类名,并用点号隔开即可。...扩展函数优点 使用扩展函数有以下几个优点: 无需修改类源代码:扩展函数可以让我们现有的类添加功能,而无需修改类源代码。这样可以避免意外修改类行为,降低了代码风险。...代码可读性更好:使用扩展函数可以让我们在代码中直接调用功能,而无需创建实例引入类。这样可以使代码更加简洁易懂。...,可以让我们现有的类添加功能,而无需修改类源代码。

25320

Kotlin课堂:高阶函数应用

简化SharedPreferences用法 回顾SharedPreferences用法,SharedPreferences中存储数据过程: 1.调用SharedPreferencesedit(...)方法获取SharedPreferences.Editor对象: 2.SharedPreferences.Editor对象中添加数据 3.调用apple()方法将添加数据提交,完成数据存储。...文件: fun SharedPreferences.open(block: SharedPreferences.Editor.() -> Unit) { val editor = edit()...editor.block() editor.apply() } 通过拓展函数方式SharedPreferences类中添加了一个open函数,并且接收一个函数类型参数,因此open...open函数接受是一个SharedPreferences.Editor类型参数因此需要调用editor.block()对函数类型参数进行调用,就可以在函数类型参数具体实现中添加数据了。

31320

安卓 topic-UI-设置 settings

添加每个 Preference 都有一个相应键值对,可供系统用来将设置保存在应用设置默认SharedPreferences 文件中。...当用户更改设置时,系统会为您更新 SharedPreferences 文件相应值。您只应在需要读取值以根据用户设置确定应用行为时,才与关联 SharedPreferences 文件直接交互。...决定要使用方法以及如何拆分设置时,应遵循 Android 设计设置指南中准则。...,因此在用户首次打开应用时,您有必要使用每个 Preference 默认值初始化相关SharedPreferences 文件。...在 PreferenceActivity 中添加必要首选项来控制应用数据使用习惯后,您应立即在清单文件中为 ACTION_MANAGE_NETWORK_USAGE 添加 Intent 过滤器。

3K10

MMKV 组件现在开源了

在会话列表、会话界面等有大量 cell 地方,希望计时器不会影响滑动性能;另外这些计数器还要永久存储下来——因为闪退随时可能发生。...考虑到这个防 crash 方案最主要诉求还是实时写入,而 mmap 内存映射文件刚好满足这种需求,我们尝试通过它来实现一套 key-value 组件。...MMKV 原理 内存准备 通过 mmap 内存映射文件,提供一段可供随时写入内存块,App 只管往里面写数据,由操作系统负责将内存回写到文件,不必担心 crash 导致数据丢失。...空间增长 使用 append 实现增量更新带来了一个问题,就是不断 append 的话,文件大小会增长得不可控。我们需要在性能和空间上做个折中。...单进程性能 可见,MMKV 在写入性能上远远超越 SharedPreferences & SQLite,在读取性能上也有相近超越表现。 ?

3.6K20

安卓开发_数据存储技术_SharedPreferences

有两种方式可以获得SharedPreferences对象 1、getSharedPreferences():  如果需要多个使用名称来区分共享文件,则可以使用该方法,其第一个参数就是共享文件名称。...SharedPreferences类中增加值方法如下 1、调用SharedPreferencesedit()方法获得SharedPreferences对象 2、调用诸如putString(),putInt...()等方法增加相应类型值 3、使用commit()方法提交值 从SharedPreferences类中读取值时,主要使用该类中定义getXXX()方法。...SharedPreferences类存储数据放在shared_prefs文件夹中 ?...data/data/包名  找到你包名   里面有个shared_prefs文件,保存文件data.xml就是 SharedPreferences类类保存数据 该数据是以Map键值对形式存放在xml

1.1K80

锦囊篇|一文摸懂SharedPreferences和MMKV

显然这就要看一下SharedPreferences实现类具体是如何进行操作了,从他构造函数看起,慢慢进入深度调用。...总结 是什么限制了SharedPreferences处理速度? 这个问题在上面的源码分析中其实已经有所提及了,那就是文件读写,所以如何加快文件读写速度是一个至关重要突破点。...当然速度妥协一个方案,想来你也已经看到了,那就是异步提交,通过子线程在用户无感知情况下把数据写到文件中。 为什么多线程安全,而多进程不安全操作?...一句话讲来就是,更改过就最后新增后面插入。 而新旧数据累加势必会造成文件庞大,那这方面MMKV给出解决方案又是怎么样呢?...总结 从源码分析完之后,和SharedPreferences相比,重新整理后可以总结为以下几点突破: mmap使用: 内存映射技术使用,减少了 SharedPreferences 拷贝和提交时间消耗

89040

一起来看看 MMKV 。。。

在会话列表、会话界面等有大量 cell 地方,希望计时器不会影响滑动性能;另外这些计数器还要永久存储下来——因为闪退随时可能发生。...考虑到这个防 crash 方案最主要诉求还是实时写入,而 mmap 内存映射文件刚好满足这种需求,我们尝试通过它来实现一套 key-value 组件。...再来了解下有关MMKV 原理: 内存准备 通过 mmap 内存映射文件,提供一段可供随时写入内存块,App 只管往里面写数据,由操作系统负责将内存回写到文件,不必担心 crash 导致数据丢失。...空间增长 使用 append 实现增量更新带来了一个问题,就是不断 append 的话,文件大小会增长得不可控。我们需要在性能和空间上做个折中。...可见,MMKV 在写入性能上远远超越 SharedPreferences & SQLite,在读取性能上也有相近超越表现。

2.1K20
领券