为什么 Datastore 比 Shared Preferences 慢
Why is Datastore slower than Shared Preferences
我正在检查数据存储和共享首选项的执行时间,我发现数据存储比共享首选项花费更多时间。
这是我的代码
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 - in this case edit { }
正在暂停功能,该功能“在幕后”切换调度程序并等待磁盘写入实际完成。
SharedPreferences apply
不会那样做 - 它会在启动异步磁盘写入时存储更改 in-memory,您无法控制也无法处理任何错误。
我正在检查数据存储和共享首选项的执行时间,我发现数据存储比共享首选项花费更多时间。
这是我的代码
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 - in this case edit { }
正在暂停功能,该功能“在幕后”切换调度程序并等待磁盘写入实际完成。
SharedPreferences apply
不会那样做 - 它会在启动异步磁盘写入时存储更改 in-memory,您无法控制也无法处理任何错误。