为了账号安全,请及时绑定邮箱和手机立即绑定

Flutter vs React Native新架构:性能对比评测

Flutter 和 React Native 的大对比

选择 React Native 和 Flutter 可能会让人感到手足无措。两者都被广泛认可和采用,大科技公司都有广泛应用(虽然 Flutter 的支持生态有时会受到质疑——不过我们暂时不谈这一点)。

通常,因素如社区规模、技术采用情况以及编程语言偏好在做出这样的选择时起着关键作用。然而,本文旨在把这些因素放在一边,专注于性能表现——这是一个直接影响用户体验和应用程序扩展性的关键因素。

我们都知道,Flutter 通常在内存分配、应用大小和运行效率方面优于 React Native,这主要是由于其架构。然而,React Native 的新架构又如何呢?虽然它已经正式发布,但最新的基准测试数据似乎显示了一些差距,这让我决定写这篇文章。

为了处理这个问题,我做了下这两个框架的基准测试。让我们一步一步来。

测试概述

我使用了三个测试用例,在三个不同的版本中,来分配重要设备资源并模拟最坏(离奇)的情况。

测试案例
  1. 一个包含1,000项的大列表,每个项是一个简单的卡片,左侧是图片(图片的细节将在后面说明),右侧是标题。
    - 代码链接:RN代码 / Flutter代码

  2. 一个包含具有动态效果的图片的大网格,重用了相同的1,000项,排列在两列中。每个图片会先放大并旋转360度,同时逐渐变淡,最后恢复到初始状态,这个过程会无限循环。
    - 代码链接:RN代码 / Flutter代码

  3. 一个包含多个Lottie动画的大网格,同样使用相同的1,000项,排列在两列中。每个项从一套包含20个独立动画文件中选择,所有这些文件都存储在项目本地。
    - 代码链接:RN代码 / Flutter代码
这些图片

我使用了一组不同大小的图片,包括25张本地图片(存储在项目中)——总共1 MB大小——和25张网络图片,通过全球CloudFront分发提供。我还使用了网络链接控制器来限制我的网速,避免测试结果受到干扰。

环境

测试是在一台配备128GB内存的MacBook M3 Max上运行的模拟器上进行的(尽管如此,可能有些过剩,因为崩溃的可能性很小,不过我们继续进行)。Android模拟器使用的是Pixel 9 Pro XL(API 35),而iOS模拟器运行的是iPhone 15 Pro Max(iOS 18.1)

除了仅在iOS上执行的FPS测试——这些测试是在一台真正的iPhone 15 Pro Max(iOS 18.1.1)上进行的,因为Xcode仅允许在真机上使用Core Animation FPS工具。

一些测试工具

iOS上,使用Xcode内置的Instruments工具进行了测试和分析,利用时间配置文件(Time Profile)来分析内存分配、CPU使用率和帧率(FPS)。在Android上,我使用了Android Studio内置的Profiler工具。

所有测试都是通过Maestro来运行的,这是一个移动UI测试框架(类似于Detox)。因此我选择了Maestro,以确保测试的一致性,避免因在一台设备上比另一台设备更快地滚动等操作影响测试结果。使用Maestro创建一个功能性的测试是如此简单。

    appId: com.apprnbenchmark  
    ---  
    - tapOn: Lottie  
    - repeat:  
        times: 6  
        commands:  
          - swipe:  
              duration: 100  
              start: 50%, 90% # 从宽度的 50%, 高度的 90%  
              end: 50%, 10% # 到宽度的 50%, 高度的 10%

Alternatively, following the second suggestion more closely:

    appId: com.apprnbenchmark  
    ---  
    - tapOn: Lottie  
    - repeat:  
        times: 6  
        commands:  
          - swipe:  
              duration: 100  
              start: 50%, 90% # 从 50%, 90%  
              end: 50%, 10% # 到 50%, 10%
框架和库的版本信息

说实话,当我刚开始创建这些测试的时候,我只是计划将Flutter与React Native(使用裸项目)进行比较。然而,在阅读了React Native的文档后,我发现他们强烈建议使用Expo来创建新项目。
那为什么不也加上一个使用Expo的React Native的对比呢?

  • React Native: 0.76.3(package.json)
    - RN Reanimated: 3.16.3
    - RN Lottie: 7.1.0
  • Expo: Expo 框架(package.json)
    - React Native: 0.76.3
    - RN Reanimated: 3.16.3
    - RN Lottie: 7.1.0
  • Flutter: 3.24.5 (pubspec.yaml)
    - Dart: 3.5.4
    - Lottie: 动效库 3.1.3
  • Maestro: Maestro(注:Maestro 是一个特定的框架或工具名称,在此上下文中保持原名更合适。)
基准结果如下

我会把基准测试结果分为Android和iOS两部分,比较应用大小、资源使用量等。最后,我会总结一下这一切,突出那些值得说一说的关键优缺点。

免责声明:本文比较了 Flutter 和 RN 在最基本的原装配置下的性能,也就是说,没有做任何额外的优化。
虽然像 Lottie、Reanimated 或 FlatList 这样的第三方库无法全面展示优化后的效果,但本文旨在展示新项目的基准性能。后续文章可能会探讨在应用优化后的这些框架,进行更公平的比较。

Android
应用的大小

Flutter 能够生成更小的 AAB 和 APK 文件,比纯 React Native 项目和使用 Expo 构建的项目生成的文件更小。这在某种程度上是预料之中的,因为 Flutter 不需要额外的库,比如 Reanimated,等等。

AAB 文件(单位:MB)

资源分配事宜

再次,Flutter 在所有指标上都优于基于 React Native 的项目。有趣的是,Flutter 在测试开始前和测试运行期间内存和 CPU 使用率几乎保持一致——至少在 Android 设备上也是如此。

虽然RN项目中的内存使用量相当大,但在Expo进行Lottie测试时,我只注意到轻微的帧数下降。除此之外,一切都很顺畅。

测试中的一些图片可以在这里看到这里看
我还录制了运行这两个测试时的屏幕,可以在这里看这里看

iOS
应用的大小

当谈到应用大小时,Flutter 和 RN 裸项目的结果相同。我使用了一个生产版的 .ipa 文件生成了下图,有点意外的是,在 iOS 上,即使需要安装 RN Reanimated 库,RN 的大小仍然与 Flutter 保持一致。

.ipa 文件(.ipa 文件),大小以 MB 为单位

分配资源

在前两次测试中,尽管RN消耗的资源比Flutter多得多,但我没有注意到任何帧丢失的情况——一切都运行得很流畅。
说到Lottie动画测试时,滚动变得完全不可能——非常卡顿。后面我会更多地讨论帧率下降的情况。

无掉帧

没有掉帧

rn刚说:fps? 哈哈(lol)

FPS

RN的测试开始时表现良好,即使面对长列表,也能稳定保持60 FPS,没有任何掉帧。Lottie的测试也顺利开始,不过,加载时已经可以明显感受到页面资源消耗较大。然而,几秒钟后,性能迅速恶化,难以维持在45 FPS以上,甚至低于45 FPS,流畅滚动也变得不可能。
最后,轮到了测试动画图片的部分。在这个环节中,FPS非常稳定,始终保持在60 FPS,没有任何掉帧。

在 Flutter 中,FPS 下降仅出现了一次,如分析图(右)所示,但在高 GPU 使用率的情况下,依然未感觉到任何明显差异。

RN / Flutter (RN/Flutter技术栈)

你可以在这里查看FPS测试结果中的图片和其他一些截图。

所以,这就是结论

因此,经过所有这些测试之后,无论编程语言喜好、采用度、社区支持或是桥接版本是否存在,Flutter 在这种情况下仍然比 RN(无论是否有 Expo)表现更优异。

Flutter 占用较少的内存和 CPU,同时生成的包大小也相对较小。React Native 的另一个问题是开发人员需要付出大量努力来优化性能,只是为了达到 Flutter 默认提供的效率水平。这种额外的复杂性可能成为团队选择开发工具时的关键因素。

总之,Flutter 在效率和资源占用方面的一贯性使它成为强有力的角色,特别是在性能优先的项目中。

感谢您看到这里!如果您想通过LinkedIn和我联系,随时欢迎联系。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消