当前位置: 首页 > news >正文

京东小程序JS API仓颉改造实践

作者:薛猛

本次创新实践为京东小程序团队与华为鸿蒙突击队合作对京东小程序API调用过程进行解析,通过借力仓颉实现小程序性能提升和便捷的开发体验

  1. 背景介绍

京东小程序容器是京东及其关联App的重要组成部分,承载了多种内部和外部业务。其中近期热门的模块秒送外卖、以及常用的买菜、超市店铺、奢侈品店铺等均属于小程序。

  1. 小程序架构

京东鸿蒙版小程序框架整体如下所示:

小程序采用双线程架构。即同时存在JS逻辑线程和WebView线程。其中JS逻辑线程(简称JS线程)负责运行JS引擎,执⾏业务逻辑;Webview通常运行在UI主线程,主要包括页面的渲染任务、响应交互事件并发送给JS线程。两个线程可能会启动worker子线程来辅助处理任务。 JS Bridge作为桥梁层,负责处理JS API的调用与派发。整体JS API派发逻辑由Native实现(C++)。当一个JS API调用请求到来后,首先判断该API是否有Native实现,如果没有则调用ArkTS的派发逻辑来调用到原生API实现。

 

  1. 性能瓶颈分析

小程序页面加载/活跃过程中存在大量的JS API的调用。通常由JS线程发起API调用,经过主线程执行后生成结果数据,再将结果返回。因此,会出现如下性能瓶颈点。
1. API如Storage(存储)、Systeminfo(系统信息)和Network(网络请求)在启动阶段被调用数十次。集中的API调用导致在主线程上出现排队情况,占用大量主线程时间,无法及时处理webview任务。
2. 由于线程之间数据不共享,跨线程的数据传递需要序列化和反序列化操作,响应延迟增大
3. JS Bridge在与原生交互时需要调用大量的nAPI接口,创建nAPI线程,处理效率较低,开发维护成本大。API有数百个,如果全部使用Native处理多线程共享问题,开发维护成本高,可行性极低

  1. 原生JS API调用过程拆解

本次选取京东小程序中执行频率最高的getSystemInfo API为例,展开拆解一次API调用的详细流程:

getSystemInfo目前是由ArkTS实现。调用由JS线程提交给主线程,主线程启用taskpool执行后再接受返回结果,等待过程中可以流水线执行下一个API。可以看到单次JS API调用会占据主线程时间来处理。当API被频繁调用时,主线程无法及时处理其他webview任务

  1. 场景分析

对京东部分小程序场景采集trace分析。以路易威登LV店铺为例,该店铺小程序在冷启动过程约2800ms,其中有900ms-1000ms的时间在webview任务中穿插这大量的getSystemInfo API的调用。经过检查代码,虽然已经根据页面hashcode缓存了该API的结果数据,但每次获取缓存值仍需要占据主线程时间,因此在该场景上可以进行仓颉API改造尝试

  1. 仓颉改造实践

仓颉的部分特性在该场景性能优化上起到了决定性作用,其中包括:

1.作为鸿蒙系统官方语言之一,具备完善的鸿蒙系统的API能力,实现1比1改写原生API的可行性
2.仓颉具备线程池能力。仓颉语言的JS API执行不占用主线程时间。仓颉线程间具备天然的内存共享能力,省去序列化和反序列化开销
3.仓颉具备高效的与C语言互操作的能力。C语言与仓颉代码互相调用只需要声明和使用,代码简单,执行快,不需要调用nAPI协议接口 
4.仓颉具备高效的与ArkTS互操作的能力,在需要时,可以获取到ArkTS语言的runtime,webview等信息,保证API执行的逻辑正确性

使用仓颉改写后的JS API执行流程如下图:

本次改造在小程序架构上重点涉及到两个模块。在JSBridge中加入仓颉API的派发逻辑,和在JS API中加入仓颉实现的JS API(getSystemInfo),如下图

  1. 仓颉穿刺优化效果

经过测试,仓颉改造后的getSystemInfo执行时间可缩短50%+,且不占用主线程时间。在LV小程序上进行冷启动端到端测试,启动性能可提升20%。 (约500ms+)

  1. 未来规划与展望

本次初步验证证明了在小程序场景,仓颉具备高效性能和开发潜力。本次验证也打造了仓颉JS API派发框架,未来基于此框架可以更快的扩展仓颉JS API。计划在以下方面进一步扩展验证仓颉:

1.更多API的仓颉化:尝试改造更多高频调用的JS API。并在京东近期更多热门场景(如秒送外卖)验证性能收益。

2.仓颉并发能力: 基于仓颉的高并发能力,尝试优化网络模块的性能,接入更多小程序

3.小程序其他阶段仓颉化探索: 除了JS API,探索小程序场景更多阶段的仓颉优化

4.在新场景使用仓颉开发:利用仓颉的性能和安全优势,将仓颉用于新模块新功能的开发。仓颉的高并发能力在AI、跨屏应用和高性能Web场景中具有广阔前景

5.跨平台支持:仓颉支持HarmonyOS、Android、iOS和PC平台,未来将完善京东跨端通用能力,降低多平台开发的复杂性。

http://www.dtcms.com/a/266574.html

相关文章:

  • 深圳安锐科技发布国内首款4G 索力仪!让斜拉桥索力自动化监测更精准高效
  • 【centos8服务如何给服务器开发3306端口】
  • Python 中线程和进程在实际项目使用中的区别和联系
  • 解决HttpServletRequest无法获取@RequestBody修饰的参数
  • Java并发性能优化|读写锁与互斥锁解析
  • Python 中的可迭代对象与迭代器:原理与项目实战
  • 【Verilog】parameter、localparam和 `define的区别
  • Android View的绘制原理详解
  • 基于虚拟化技术的网闸安全交换:物理隔离时代的智能数据流通引擎
  • 最快实现的前端灰度方案
  • python打卡day58@浙大疏锦行
  • 算法19天|回溯算法:理论基础、组合、组合总和Ⅲ、电话号码的字母组合
  • 用原生 JS + Vue 实现一套可复用的前端错误监控系统
  • Python 机器学习核心入门与实战进阶 Day 2 - KNN(K-近邻算法)分类实战与调参
  • 【MATLAB代码】AOA与TDOA混合定位例程,适用于三维环境、4个锚点的情况,订阅专栏后可以获得完整代码
  • 计算机网络笔记(不全)
  • Windows 本地安装部署 Apache Druid
  • 无人机载重模块技术要点分析
  • Science Robotics发表 | 20m/s自主飞行+避开2.5mm电线的微型无人机!
  • CSS长度单位问题
  • 通过Claude 生成图片的prompt集锦(一)
  • 7.4项目一问题准备
  • 实验五-Flask的简易登录系统
  • 数据结构 之 【堆】(堆的概念及结构、大根堆的实现、向上调整法、向下调整法)(C语言实现)
  • K8s服务发布基础
  • CI/CD持续集成与持续部署
  • 基于大模型的强直性脊柱炎全周期预测与诊疗方案研究
  • 力扣面试150(15/150)
  • 7.4 arm作业
  • 玩转n8n工作流教程(一):Windows系统本地部署n8n自动化工作流(n8n中文汉化)