android - 为什么 Datastore 比 Shared Preferences 慢

标签 android sharedpreferences android-jetpack android-jetpack-datastore

我正在检查数据存储和共享首选项的执行时间,我观察到数据存储比共享首选项花费的时间更多。
这是我的代码

suspend fun saveUser(user: User, context: Context) {
            val userString =
                Json.encodeToString(User.serializer(), user)
            val time1 = System.nanoTime()
            context.dataStore.edit { preferences ->
                preferences[PreferencesKeys.USER] = userString
            }
            val time2 = System.nanoTime()
            with(userPref.edit()) {
                putString(HOME_USER_KEY, userString)
                apply()
            }
            val time3 = System.nanoTime()
            println("Time taken")
            println("Datastore : ${time2 - time1}")
            println("Shared Preferences : ${time3 - time2}")
        }
和输出
I/System.out: Time taken
I/System.out: Datastore : 208257769
I/System.out: Shared Preferences : 14458539

I/System.out: Time taken
I/System.out: Datastore : 2892692
I/System.out: Shared Preferences : 246462

I/System.out: Time taken
I/System.out: Datastore : 3043770
I/System.out: Shared Preferences : 293846

I/System.out: Time taken
I/System.out: Datastore : 5548077
I/System.out: Shared Preferences : 321846

I/System.out: Time taken
I/System.out: Datastore : 2344076
I/System.out: Shared Preferences : 208616
知道为什么会发生这种情况吗?

最佳答案

因为数据存储有 thread safety 的附加层- 在这种情况下 edit { } 正在暂停功能,该功能在“幕后”切换调度程序并等待磁盘写入实际完成。
共享首选项 apply 不这样做 - 它在启动异步磁盘写入时将更改存储在内存中,您无法控制也无法处理任何错误。

关于android - 为什么 Datastore 比 Shared Preferences 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71601343/

相关文章:

android-jetpack-compose - 为什么有些人仍然在 jetpack compose 中使用 viewmodel?

Android 彩信示例

android - 使用具有多个相同资源的共享首选项造成困惑

android - SharedPreference 值未更新

java - Android Studio - 保存所有玩过的游戏的累积分数

android - 为什么 onBindViewHolder 中的 getItem 永远为空?

android - 如何使用新的 androidx.lifecycle :*:2. 2.0-alpha01 获取 lifecycle.coroutineScope

android - 如何知道 Android 何时在 Genymotion VM 中准备就绪?

java - 安装带有依赖的jar到maven仓库(Android gcm-server push library)

android - Xamarin Android EditText setError不显示文本