第四板斧:合理使用系统接口,避免冗余操作
应该合理使用系统的高频回调接口,删除不必要的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(() => {
// 业务代码
// ...
})
}