1# 合理使用系统提供的接口
2
3## 简介
4
5在应用开发中,经常会调用系统提供的接口,比如读取本地文件、处理服务端数据等等。若对接口使用不合理,可能引起延迟、卡顿、丢帧等性能问题。本文以如下系统提供的接口为例,总结了使用中的注意事项。
6
7- [ResourceManager](../reference/apis-localization-kit/js-apis-resource-manager.md)的getXXXSync接口
8- [wordBreak](../reference/apis-arkui/arkui-ts/ts-basic-components-text.md#wordbreak11)属性
9
10## ResourceManager的getXXXSync接口
11
12ResourceManager通过getXXXSync接口获取资源的方式有两种:通过resource对象```resourceManager.getStringSync($r('app.string.test'))```和通过id```resourceManager.getStringSync($r('app.string.test').id)```。
13下面以[getStringSync](../reference/apis-localization-kit/js-apis-resource-manager.md#getstringsync10)为例,测试一下这两种参数在方法中的使用是否会有耗时区别。
14
15### 通过resource对象获取
16
17```ts
18import { hiTraceMeter } from '@kit.PerformanceAnalysisKit';
19
20@Entry
21@Component
22struct Index {
23  @State message: string = 'getStringSync';
24
25  aboutToAppear(): void {
26    hiTraceMeter.startTrace('getStringSync', 1);
27    // getStringSync接口的入参直接使用资源,未使用资源ID
28    getContext().resourceManager.getStringSync($r('app.string.test'));
29    hiTraceMeter.finishTrace('getStringSync', 1);
30  }
31
32  build() {
33    RelativeContainer() {
34      Text(this.message)
35        .fontSize(50)
36        .fontWeight(FontWeight.Bold)
37    }
38    .height('100%')
39    .width('100%')
40  }
41}
42```
43
44通过[SmartPerf Host](performance-optimization-using-smartperf-host.md)工具抓取Trace。持续时间为1.621ms。
45
46![](figures/reasonable_using_system_interfaces_getstringsync.png)
47
48### 通过id获取
49
50```ts
51import { hiTraceMeter } from '@kit.PerformanceAnalysisKit';
52
53@Entry
54@Component
55struct Index {
56  @State message: string = 'getStringSyncAfter';
57
58  aboutToAppear(): void {
59    hiTraceMeter.startTrace('getStringSyncAfter', 2);
60    // getStringSync接口的入参使用了资源ID
61    getContext().resourceManager.getStringSync($r('app.string.test').id);
62    hiTraceMeter.finishTrace('getStringSyncAfter', 2);
63  }
64
65  build() {
66    RelativeContainer() {
67      Text(this.message)
68        .fontSize(50)
69        .fontWeight(FontWeight.Bold)
70    }
71    .height('100%')
72    .width('100%')
73  }
74}
75```
76
77通过[SmartPerf Host](performance-optimization-using-smartperf-host.md)工具抓取Trace。持续时间为0.124ms。
78
79![](figures/reasonable_using_system_interfaces_getstringsyncafter.png)
80
81### 总结
82
83参数为资源信息时(1.621ms)比参数为资源ID值时(0.124ms)耗时更多。所以当需要使用类似方法时,使用资源ID值作为参数更优。
84
85## wordBreak属性
86
87零宽空格(Zero Width Space, ZWSP)是一个特殊的Unicode字符。它是一个不可见的字符,其宽度为零,不占用任何可见空间。在文本处理系统中,尽管它在视觉上是不可见的,但它在文本中确实存在,并可以作为潜在的断点,即允许在此位置断开行。这意味着如果一行文本过长需要自动换行时,文本可以在零宽空格的位置进行折行,而不影响单词的完整性。
88
89虽然零宽空格在许多情况下都是有用的,但它也可能引起问题,特别是在文本处理和数据清洗中。不注意这些看不见的字符可能导致数据的意外错误、搜索失败、数据不一致等问题。因此,在处理来自不同源的文本数据时,了解和考虑这些不可见字符是非常重要的。
90
91避免在文本组件内使用零宽空格(\u200b)的形式来设置断行规则,推荐使用[wordBreak](../reference/apis-arkui/arkui-ts/ts-basic-components-text.md#wordbreak11),wordBreak在使用性能方面优于零宽空格。例如推荐用法为:Text(this.diskName).wordBreak(WordBreak.BREAK_ALL)。
92
93### 反例
94
95```ts
96@CustomDialog
97export struct DiskFormatDialog {
98  private diskName: string = '';
99  build() {
100    Column() {
101      Text(this.diskName.split("").join("\u200B"))
102      .textAlign(TextAlign.Start)
103    }
104  }
105}
106```
107
108通过[SmartPerf Host](performance-optimization-using-smartperf-host.md)工具抓取Trace。启动时ReceiveVsync阶段耗时为3s271ms。
109
110![](figures/reasonable_using_system_interfaces_2.PNG)
111
112### 正例
113
114```ts
115@CustomDialog
116export struct DiskFormatDialog {
117  private diskName: string = '';
118  build() {
119    Column() {
120      Text(this.diskName)
121      .textAlign(TextAlign.Start)
122      .wordBreak(WordBreak.BREAK_ALL)
123    }
124  }
125}
126```
127
128通过[SmartPerf Host](performance-optimization-using-smartperf-host.md)工具抓取Trace。启动时ReceiveVsync阶段耗时为301ms。
129
130![](figures/reasonable_using_system_interfaces_4.PNG)
131
132### 总结
133
134使用零宽空格时(3s271ms)比使用wordBreak时(301ms)耗时更多。所以当需要使用类似方法时,使用wordBreak性能更优。
135