1. ArkTS vs. React:性能模型的代差
React 的性能模型是建立在 JavaScript 运行时 之上的“补丁”,而 ArkTS 的性能模型是建立在 系统级 AOT 编译 之上的“预设”。
A. 渲染指令的执行
- React (Web/RN): 所有的 UI 变化都要经过 JS 线程的计算(Diff 算法),生成虚拟 DOM,然后通过“桥(Bridge)”或者 JSI 将指令发给原生层。当 JS 线程繁忙(如大量数据处理)时,UI 就会卡顿。
- ArkTS: UI 描述在编译阶段就高度结构化了。状态改变后,ArkTS 直接在 C++ 层进行高效的属性对齐和增量更新,UI 线程与逻辑线程分离。即使逻辑层在忙,渲染层的动画和滑动依然可以由系统进程独立保证。
B. 内存与垃圾回收 (GC)
- React: 依赖 JS 引擎的 GC。频繁创建虚拟 DOM 对象会产生大量的短命对象,触发频繁的 GC 导致瞬间掉帧。
- ArkTS: 通过静态类型约束,大幅减少了运行时的元数据。它采用了分代模型和并发标记技术,且因为不需要维护庞大的虚拟 DOM 树,内存压力显著更小。
C. 启动速度
- React: 需要下载 JS 包 -> 解析 -> 编译 (JIT) -> 执行。
- ArkTS: 应用在安装时或首次启动前就已经编译成了机器码(AOT)。启动即运行,没有中间商赚差价。
2. ArkTS 是否支持 JIT?
答案是:ArkTS 在生产环境中不支持 JIT,它坚定地选择了 AOT。
这与传统的 JavaScript 引擎(如 V8)有着本质的区别。
为什么不支持 JIT?
- 性能确定性: JIT 的性能是不确定的。当引擎发现某段代码是“热点”时才会优化它,这会导致应用运行一段时间后才变快,且随时可能因为类型改变而退化(De-optimization)。华为追求的是从第一秒开始的丝滑。
- 功耗控制: JIT 在后台持续监控和重编代码是非常耗电的。AOT 一次编译,处处运行,对移动设备更友好。
- 安全性: JIT 需要在内存中动态生成可执行代码,这在系统安全层面是一个潜在的攻击点。AOT 生成的是只读的二进制代码,安全性更高。
调试模式下的特殊性
虽然生产环境纯 AOT,但在开发阶段(Debug 模式) ,为了实现“预览器实时刷新”和“快速热重载”,ArkUI 内部会使用一种类似解释执行或轻量级即时处理的机制,但这仅用于提升开发效率,不代表运行性能。
3. 核心差异总结表
| 特性 | React (JavaScript) | ArkTS (HarmonyOS) |
|---|---|---|
| 编译模型 | JIT (运行时实时优化) | AOT (运行前全量优化) |
| 类型系统 | 动态 (运行时确定) | 静态 (编译时确定) |
| UI 更新单位 | 组件级 (Virtual DOM Diff) | 属性级 (Data-driven Attribute Sync) |
| 线程模型 | 单线程 (逻辑与渲染竞争) | 多线程协作 (渲染服务独立化) |
| 跨端本质 | 抽象层 (通过 Bridge 调用) | 原生集成 (语言即系统一部分) |
总结
如果你习惯了 React,你会发现 ArkTS 像是一个**“加了紧箍咒但跑得更快的 React”**。
- React 的灵活性来自于 JS 的动态性。
- ArkTS 的流畅性来自于对动态性的克制。
它牺牲了 eval()、动态类型更改等极少数场景,换取了在手机、平板乃至微设备上的一致性高性能表现。