鸿蒙NEXT开发【合理使用系统接口,避免冗余操作】 性能调优
合理使用系统接口,避免冗余操作
应该合理使用系统的高频回调接口,删除不必要的Trace和日志打印,避免冗余操作,减少系统开销(详细介绍可参考文章: 避免开发过程中的冗余操作)。
避免在系统高频回调用进行冗余和耗时操作
应该避免在onScroll、onAreaChange等系统高频的回调接口中进行冗余和耗时操作,这些接口在系统的每一帧绘制中都会执行回调操作,因此在这些接口中进行冗余和耗时操作会大量消耗系统资源,影响应用运行性能。
避免在系统高频回调用打印Trace
Trace的打印是会额外消耗系统性能的,因此应该避免在这些系统高频回调接口中打印Trace,示例代码如下:
// 反例
Scroll() {
ForEach(this.arr, (item: number) => {
Text("ListItem" + item)
.width("100%")
.height("100%")
}, (item: number) => item.toString())
}
.width('100%')
.height('100%')
.onScroll(() => {
hitrace.startTrace("ScrollSlide", 1002);
// 业务逻辑
// ...
hitrace.finishTrace("ScrollSlide", 1002);
})
// 正例
@Component
struct PositiveOfOnScroll {
private arr: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
build() {
Scroll() {
List() {
ForEach(this.arr, (item: number) => {
ListItem() {
Text("TextItem" + item)
}
.width("100%")
.height(100)
}, (item: number) => item.toString())
}
.divider({ strokeWidth: 3, color: Color.Gray })
}
.width('100%')
.height('100%')
.onScroll(() => {
// 业务逻辑
// ...
})
}
}
避免在系统高频回调用打印日志
日志的打印是会额外消耗系统性能的,特别是有些日志还读取了状态变量的信息,会加剧资源开销,因此应该避免在这些系统高频回调接口中打印日志,示例代码如下:
// 反例
@Component
struct NegativeOfOnScroll {
private arr: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
build() {
Scroll() {
List() {
ForEach(this.arr, (item: number) => {
ListItem() {
Text("TextItem" + item)
}
.width("100%")
.height(100)
}, (item: number) => item.toString())
}
.divider({ strokeWidth: 3, color: Color.Gray })
}
.width('100%')
.height('100%')
.onScroll(() => {
hilog.info(1002, 'Scroll', 'TextItem');
// 业务逻辑
// ...
})
}
}
// 正例
@Component
struct PositiveOfOnScroll {
private arr: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
build() {
Scroll() {
List() {
ForEach(this.arr, (item: number) => {
ListItem() {
Text("TextItem" + item)
}
.width("100%")
.height(100)
}, (item: number) => item.toString())
}
.divider({ strokeWidth: 3, color: Color.Gray })
}
.width('100%')
.height('100%')
.onScroll(() => {
// 业务逻辑
// ...
})
}
}
删除冗余Trace和日志打印
Trace和日志打印会比较消耗系统性能,因此我们应该避免冗余的Trace和日志打印。推荐在Release版本中,尽量删除所有Trace信息,删除Debug日志,减少额外的系统开销。
在Release版本中删除Trace
Trace会比较消耗系统性能,建议在Release版本删除Trace打印。
反例代码如下:
@Component
struct NegativeOfTrace {
aboutToAppear(): void {
hitrace.startTrace("HITRACE_TAG_APP", 1003);
// 业务代码
// ...
hitrace.finishTrace("HITRACE_TAG_APP", 1003);
}
build() {
// 业务代码
}
}
正例代码如下:
@Component
struct PositiveOfTrace {
aboutToAppear(): void {
// 业务代码
// ...
}
build() {
// 业务代码
}
}
在Release版本中删除Debug日志
虽然在Release版本中不会打印debug级别日志,但是如果在日志的入参中进行了参数拼接,字符串拼接的逻辑还是会执行(详细介绍可参考文章: 避免开发过程中的冗余操作),会有冗余开销,因此建议在Release版本删除Debug日志打印。
反例代码如下:
@Component
struct NegativeOfDebug {
@State string1: string = 'a';
@State string2: string = 'b';
aboutToAppear(): void {
hilog.debug(1004, 'Debug', (this.string1 + this.string2));
// 业务代码
// ...
}
build() {
// 业务代码
// ...
}
}
正例代码如下:
@Component
struct PositiveOfDebug {
aboutToAppear(): void {
// 业务代码
// ...
}
build() {
// 业务代码
// ...
}
}
避免设置冗余系统回调监听
冗余的系统回调监听,会额外消耗系统开销去做计算和函数回调消耗。比如设置了onAreaChange,就算回调中没有任何逻辑,系统也会在C++侧去计算该组件的大小和位置变化情况,并且把结果回调到TS侧,额外消耗了系统开销。
反例代码如下:
@Component
struct NegativeOfOnClick {
build() {
Button('Click', { type: ButtonType.Normal, stateEffect: true })
.onClick(() => {
hitrace.startTrace("ButtonClick", 1004);
hilog.info(1004, 'Click', 'ButtonType.Normal')
hitrace.finishTrace("ButtonClick", 1004);
// 业务代码
// ...
})
.onAreaChange((oldValue: Area, newValue: Area) => {
// 无任何代码
})
}
}
正例代码如下:
@Component
struct PositiveOfOnClick {
build() {
Button('Click', { type: ButtonType.Normal, stateEffect: true })
.onClick(() => {
// 业务代码
// ...
})
}
使用性能工具分析和定位问题
学会合理使用工具进行问题分析和定位,提升问题解决效率。
学会使用IDE的Profier工具定位问题
通过使用Profier工具,定位应用开发过程中的各种性能问题,详细的使用方法可以参考下列文章:性能分析工具CPU Profiler、页面布局检查器ArkUI Inspector、内存分析器Allocation Profiler、 帧率分析工具 Frame Profiler、 启动分析工具Launch Profiler、内存快照Snapshot Profiler、耗时分析器Time Profiler。
使用SmartPerf-Host分析应用性能
SmartPerf-Host是一款深入挖掘数据、细粒度展示数据的性能功耗调优工具,可采集CPU调度、频点、进程线程时间片、堆内存、帧率等数据,采集的数据通过泳道图清晰地呈现给开发者,同时通过GUI以可视化的方式进行分析。工具当前为开发者提供了五个分析模板,分别是帧率分析、CPU/线程调度分析、应用启动分析、TaskPool分析、动效分析。
使用状态变量组件定位工具分析状态变量关联信息
开发者可以使用状态变量组件定位工具获取状态管理相关信息,例如自定义组件拥有的状态变量、状态变量的同步对象和关联组件等,了解状态变量影响UI的范围,写出高性能应用代码。
使用常用trace使用指导协助定位性能问题
本文旨在介绍OpenHarmony中常用的Trace,解释它们的含义和用途,并阐述如何通过这些Trace来识别潜在的性能问题。同时,我们还将详细介绍Trace的工作原理,帮助读者更好地理解这些Trace及如何实现性能数据的采集和分析。通过本文的阅读,读者将对OpenHarmony中的Trace有一个深入的了解,为应用程序性能优化提供有力支持。
更多推荐


所有评论(0)