相关问题
 首页LazyForEach predict耗时久分析 
2052浏览  • 1回复 待解决
HarmonyOS 应用启动OAID弹窗占用耗时长 
1032浏览  • 1回复 待解决
NAPI 的 napi_throw_error 不会导致应用崩溃 
2422浏览  • 1回复 待解决
冷启动加载耗时长,应用在设备上冷启动打开加载完成耗时XXXXms 
2319浏览  • 1回复 待解决
openharmony napi 异步耗时阻塞js的ui刷新 
6738浏览  • 1回复 已解决
HarmonyOS getStringSync和getNumber方法耗时导致性能问题 
1407浏览  • 1回复 待解决
HarmonyOS 地图计算复杂路线耗时导致页面卡顿 
1250浏览  • 1回复 待解决
长列表数据对象创建耗时过长导致UI卡顿 
1848浏览  • 2回复 待解决
如何分析组件性能,如何知道自定义组件的布局、渲染等各个阶段的耗时,分析组件性能。 
1630浏览  • 1回复 待解决
HarmonyOS Profile性能分析冷启动时,部分高耗时不显示Category,Symbol Name显示(program),不知道代表什么意思?如何进一步分析耗时原因? 
1070浏览  • 1回复 待解决
#鸿蒙通关秘籍# 如何通过系统提供的动画接口来避免自定义动画导致的丢帧问题? 
724浏览  • 0回复 待解决
HarmonyOS native 中执行长耗时任务收到中断信号,导致函数异常终止 
962浏览  • 1回复 待解决
如何处理ForEach第三个参数键值生成耗时久导致的卡顿问题 
1484浏览  • 1回复 待解决
鸿蒙NAPI机制具体的执行过程,如何实现js和c++通信的 
15011浏览  • 1回复 待解决
HarmonyOS HiAppEvent订阅的崩溃堆栈,关键信息不全,导致无法进一步分析 
1308浏览  • 1回复 待解决
HarmonyOS  统计页面停留时长 
912浏览  • 1回复 待解决
JsCreateAVPlayer耗时较长 
2636浏览  • 1回复 待解决
#鸿蒙学习大百科#napi_env禁止缓存了,是啥情况导致的? 
1115浏览  • 1回复 待解决
实时视频流文本识别如何避免丢帧抖动? 
520浏览  • 0回复 待解决
性能调试工具及其滑动丢帧案例分享 
2542浏览  • 1回复 待解决
HarmonyOS 怎么获取视频的播放时长? 
1582浏览  • 1回复 待解决
HarmonyOS 编译期耗时问题 
1361浏览  • 1回复 待解决
HarmonyOS  webview加载很耗时 
1040浏览  • 1回复 待解决
HarmonyOS AVDexmuer无法获取视频时长 
979浏览  • 1回复 待解决
HarmonyOS vibrator如何自定义震动时长 
786浏览  • 1回复 待解决





















1:通过trace看,异步网络请求的完成后处理时间长,导致主线程卡顿。网络请求是从主线程起的异步任务,但是异步任务完成后的回调是在主线程进行的,所以此函数回调耗时会影响主线程卡顿。
2:Napi的线程工作原理如下:complete函数在起线程任务中执行。
3:napi创建异步任务的接口和创建异步任务的业务代码如下,complete函数对应业务代码为:finishFunc函数,但是finishFunc函数实现如下所示,也很简单,只是做了一个赋值。
4:本地尝试复现,增加日志发现虽然业务代码很简单,只是将native数据 赋值给js。但是耗时较长。
3:到此本以为是由于数据copy赋值导致的问题。但是继续观测trace文件中的ArkTsCallBack涌道,发现arkts有业务处理耗时占用比例也极高。因此怀疑该trace打点不止是该函数内。通过与性能工具专家胜军 军哥讨论并通过demo验证,fetch之后的then处理也包含在了这个trace函授打点之内,因此将耗时统计放到napi_resolve_deferred之前,得到的结果确认:该函数本身并不耗时:
4:并且通过IDE的ArkTsCallback调用栈看到,确实是异步线程拿到数据之后,对数据进行处理的业务消耗导致:
5:同理:在启动过程中也有 NAPI: complete FileReadText 的业务消耗:
6:该部分内容都是动态布局,需要动态布局进行分析,这些耗时消耗是否可以进行并发处理。
总结:
1:Napi的Compte 回调 在创建异步任务的线程处理,如果是主线程创建,complete回调也在主线程,如果回调耗时,也会影响主线程。
2:由于complete是返回一个promse,因此promise之后then的处理消耗也是在该函数内消耗。即:promise之后的所有回调/Then处理,都在一个线程内。因此需要注意promise/async并没有起线程,promise内部或者then的处理都在同一个线程内。如果有耗时操作,不建议使用promise/async,建议使用TaskPool进行异步调度。
3:trace是通过代码增加的打点,调用栈是通过系统采样采集的,两者侧重的不同,两者可以结合使用,方便问题定位。