相关问题
首页LazyForEach predict耗时久分析
886浏览 • 1回复 待解决
冷启动加载耗时长,应用在设备上冷启动打开加载完成耗时XXXXms
1065浏览 • 1回复 待解决
NAPI 的 napi_throw_error 不会导致应用崩溃
1113浏览 • 1回复 待解决
HarmonyOS getStringSync和getNumber方法耗时导致性能问题
363浏览 • 1回复 待解决
openharmony napi 异步耗时阻塞js的ui刷新
5515浏览 • 1回复 已解决
长列表数据对象创建耗时过长导致UI卡顿
487浏览 • 2回复 待解决
如何分析组件性能,如何知道自定义组件的布局、渲染等各个阶段的耗时,分析组件性能。
466浏览 • 1回复 待解决
#鸿蒙通关秘籍# 如何通过系统提供的动画接口来避免自定义动画导致的丢帧问题?
57浏览 • 0回复 待解决
如何处理ForEach第三个参数键值生成耗时久导致的卡顿问题
570浏览 • 1回复 待解决
鸿蒙NAPI机制具体的执行过程,如何实现js和c++通信的
13408浏览 • 1回复 待解决
JsCreateAVPlayer耗时较长
1674浏览 • 1回复 待解决
#鸿蒙学习大百科#napi_env禁止缓存了,是啥情况导致的?
185浏览 • 0回复 待解决
性能调试工具及其滑动丢帧案例分享
855浏览 • 1回复 待解决
WebView之通信,什么是WebView,为什么要通信,如何实现通信?
1519浏览 • 1回复 待解决
应用崩溃分析服务,应用上架后的质量分析,比如自动集成崩溃分析这种
370浏览 • 1回复 待解决
HarmonyOS 编译期耗时问题
145浏览 • 1回复 待解决
Xcomponent绘图流程分析
1420浏览 • 1回复 待解决
实现一个自定义动画,出现丢帧问题
394浏览 • 1回复 待解决
#鸿蒙学习大百科#什么情况下会产生丢帧?
206浏览 • 1回复 待解决
指令数问题分析,如何抓取指令数进行问题拆解和分析。
875浏览 • 1回复 待解决
#鸿蒙通关秘籍# HarmonyOS组件通信中,如何处理对象嵌套多层导致的状态失去响应性问题?
105浏览 • 1回复 待解决
HarmonyOS 崩溃监控addWatcher接口耗时
34浏览 • 1回复 待解决
如何录制视频并设置最大录制时长?
140浏览 • 0回复 待解决
如何分析Faultlog日志的内容(JSCrash,CppCrash、Appfreeze等异常的分析步骤)
2062浏览 • 1回复 待解决
HarmonyOS 如何统计应用冷启动耗时
420浏览 • 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是通过代码增加的打点,调用栈是通过系统采样采集的,两者侧重的不同,两者可以结合使用,方便问题定位。