相关问题
首页LazyForEach predict耗时久分析
746浏览 • 1回复 待解决
冷启动加载耗时长,应用在设备上冷启动打开加载完成耗时XXXXms
920浏览 • 1回复 待解决
HarmonyOS getStringSync和getNumber方法耗时导致性能问题
225浏览 • 1回复 待解决
openharmony napi 异步耗时阻塞js的ui刷新
5383浏览 • 1回复 已解决
NAPI 的 napi_throw_error 不会导致应用崩溃
912浏览 • 1回复 待解决
长列表数据对象创建耗时过长导致UI卡顿
291浏览 • 2回复 待解决
如何分析组件性能,如何知道自定义组件的布局、渲染等各个阶段的耗时,分析组件性能。
330浏览 • 1回复 待解决
如何处理ForEach第三个参数键值生成耗时久导致的卡顿问题
405浏览 • 1回复 待解决
JsCreateAVPlayer耗时较长
1541浏览 • 1回复 待解决
鸿蒙NAPI机制具体的执行过程,如何实现js和c++通信的
13173浏览 • 1回复 待解决
性能调试工具及其滑动丢帧案例分享
710浏览 • 1回复 待解决
#鸿蒙学习大百科#napi_env禁止缓存了,是啥情况导致的?
66浏览 • 0回复 待解决
WebView之通信,什么是WebView,为什么要通信,如何实现通信?
1238浏览 • 1回复 待解决
实现一个自定义动画,出现丢帧问题
282浏览 • 1回复 待解决
#鸿蒙学习大百科#什么情况下会产生丢帧?
86浏览 • 1回复 待解决
应用崩溃分析服务,应用上架后的质量分析,比如自动集成崩溃分析这种
227浏览 • 1回复 待解决
Xcomponent绘图流程分析
1152浏览 • 1回复 待解决
应用事件打点-统计某个页面浏览时长
746浏览 • 1回复 待解决
指令数问题分析,如何抓取指令数进行问题拆解和分析。
622浏览 • 1回复 待解决
HarmonyOS 如何统计应用冷启动耗时
251浏览 • 1回复 待解决
socket通信示例,创建tcp server和tcp client进行通信
652浏览 • 1回复 待解决
在使用序列化方式实现线程间JS对象的数据通信时,是否会导致性能问题。
283浏览 • 1回复 待解决
如何分析Faultlog日志的内容(JSCrash,CppCrash、Appfreeze等异常的分析步骤)
1907浏览 • 1回复 待解决
#鸿蒙学习大百科#项目中有多个har/hsp模块,代码微调会导致整个项目重新编译,耗时太长,该怎么处理?
71浏览 • 1回复 待解决
HarmonyOS如何从音频文件中获取音频时长
440浏览 • 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是通过代码增加的打点,调用栈是通过系统采样采集的,两者侧重的不同,两者可以结合使用,方便问题定位。