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 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 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 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 131 132### 总结 133 134使用零宽空格时(3s271ms)比使用wordBreak时(301ms)耗时更多。所以当需要使用类似方法时,使用wordBreak性能更优。 135