HarmonyOS 鸿蒙Next中开发使用了多个Preference实例,串行await获取首选项的值出现较大延迟
HarmonyOS 鸿蒙Next中开发使用了多个Preference实例,串行await获取首选项的值出现较大延迟 在开发使用了多个Preference实例,在封装的首选项操作方法中进行了是否存在实例的判断。如下文,一个操作里面存在两个await的异步操作,在批量获取数据时,多个获取首选项操作串行,有明显的延迟。而且在存储数据时多个put串行,如果操作过快,有可能在后续获取数据时拿不到指定的数据。
个人想了两个解决办法,一是删除验证是否存在首选项实例的异步操作,可以减少一半的异步操作,而是使用taskpool,将同一批get或put操作分配到各个线程,等到所有都完成后统一进入下一个步骤。
// 从用户首选项获取数据
async getPreferenceValue(name:string, key:string, defaultValue:preferences.ValueType){
if (!this.prefMap.has(name)) {
console.log('testTag', `Preferences[${name}]尚未初始化`)
return
}
try {
// 获取preference对象
let pref = this.prefMap.get(name)
// 读数据
let value = await pref.get(key, defaultValue)
console.log('testTag', `读取Preferences[${name}.${key} = ${value}]成功`)
return value
} catch (error) {
console.log('testTag', `读取Preferences[${name}.${key}]失败`, JSON.stringify(error))
}
}
更多关于HarmonyOS 鸿蒙Next中开发使用了多个Preference实例,串行await获取首选项的值出现较大延迟的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
1、首选项场景介绍,参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/data-persistence-by-preferences-V5#
2、async/await,通过使用async关键字声明一个函数为异步函数,并使用await关键字等待Promise的解析(完成或拒绝),以同步的方式编写异步操作的代码。
更多关于HarmonyOS 鸿蒙Next中开发使用了多个Preference实例,串行await获取首选项的值出现较大延迟的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,使用多个Preference实例并通过串行await
获取首选项值出现较大延迟,可能涉及以下原因:
-
存储机制:鸿蒙的Preference数据存储在本地文件中,频繁的读写操作可能导致I/O瓶颈,尤其是在多个Preference实例同时操作时。
-
异步处理:
await
会阻塞当前任务,等待异步操作完成。如果多个Preference实例的读取操作依次执行,每个操作都需要等待前一个完成,累积的延迟会显著增加。 -
线程调度:鸿蒙的任务调度机制可能会影响异步操作的执行效率,尤其是在多任务并发时,线程切换和资源分配可能导致延迟。
-
数据量:如果Preference中存储的数据量较大,每次读取时的解析和加载时间也会增加,尤其是在串行操作中,延迟会被放大。
-
系统负载:设备的整体负载情况(如CPU、内存占用)也会影响Preference读取操作的响应时间。
解决方法可考虑并行化读取操作或优化Preference的使用方式,但具体实现需根据实际场景调整。
在HarmonyOS鸿蒙Next中,串行使用await
获取多个Preference
实例的值可能导致延迟。建议优化如下:
-
并行获取:使用
Promise.all
并行获取多个Preference
值,减少等待时间。 -
缓存机制:对频繁访问的首选项数据进行缓存,避免重复读取。
-
减少依赖:检查是否所有
Preference
实例都需要实时读取,部分数据可以延迟加载。 -
优化逻辑:重新评估业务逻辑,确保首选项的使用是必要的,避免不必要的I/O操作。