Flutter和原生应用性能对比

本文由玉刚说写做平台提供写做赞助,版权归玉刚说微信公众号全部
原做者:Xiasm
版权声明:未经玉刚说许可,不得以任何形式转载android

前言

自从今年google IO大会推出flutter跨平台开发框架以来,flutter在各个技术论坛里被吵得如日中天。flutter团队直言flutter能够帮助开发者轻松实现恒定60fps的性能体验。这里附上flutter官方性能介绍:flutter应用程序性能介绍
咱们知道flutter跨平台的原理是采用dart语言预编译的方式直接编译出各个平台的原生代码,而不须要相似RN用JavaScript桥接器执行原生代码。那么这样作的性能究竟如何呢?是否能达到和原生同样的流畅度,是否如官方所说达到恒定60fps的性能体验?今天咱们就以android为例从几个不一样的维度来实际测试一下!git

安装包对比

咱们分别用 flutter 和 android 原生来编写一个ui效果如出一辙的 apk,而后打出 release 版本的安装包,为了保证测试结果的可靠性,咱们不引入任何第三方库,只用框架提供的控件作一些简单ui,这里附上demo源码:flutter demoandroid demo。好了,咱们打出各自的release版本apk,而后使用AndroidStudio自带的APK Analyzer进行分析,以下图:github



android原生apk

flutter apk
  • apk 大小 能够明确的看出来,原生的安装包要比 flutter 安装包小约 6M 左右。
  • classes.dex 大小 看 dex 大小你会不会很奇怪,原生的 classes.dex 居然比 flutter 版的dex大六百多KB,这是由于原生的 dex 里引入了 support 库和各类基础控件(ImageView TextView等等),而 flutter 的 dex 里面没有support库,也没有原生控件,实际上 flutter 实现了一套本身的控件,包括 Material Design 和 Cupertino(iOS风格的widget)。
  • res 对比 能够看到原生的资源文件要比 flutter 大约200多k,而咱们项目中没有编写任何资源文件,因此这些资源文件大可能是 support 包和 sdk 自带的。
  • lib 库 你们可能会发现,咱们的 flutter 版 app 多出了一个 lib 库,打开里边是一个 libflutter.so,由于 Flutter 引擎是用 C、C++ 来编写的,在 android 上会使用 ndk 编译,在 iOS 上使用 LLVM 编译,而咱们本身写的 dart 代码会经过 AOT 编译成各个平台的本地代码。

经过对比咱们了解到,flutter 版的 apk 大小会比 android 原生的多出约 6M 左右,其中核心引擎大约 3.2MB,框架+应用程序代码大约是 1.25MB,必需的 Java 代码 .dex 将近 60k,而 assets 文件里还约有 2.1MB 的 ICU 数据等,单纯从安装包上来讲,原生是要优于 flutter 的。微信

运行性能测试

为了测试覆盖更加充分,咱们分别在 debug 和 release 模式上进行性能测试。而据官方介绍 flutter 的 debug 模式在性能上是要略于 release 版的,因此他们提供了 profile 模式供咱们测试,profile 模式编译和启动 Flutter 应用程序几乎与 release 模式彻底相同。
咱们先看 android 原生的 debug 和 flutter 的 proflle 模式性能对比,这里咱们用 Android Profiler 进行性能指标检测,demo 只有一个界面,用 ListView 展现 10000 条数据。下面看图:app


android原生debug性能检测图

flutter profile性能检测图
  • CPU资源占用 首先,咱们看 CPU 的占用,在启动的时候,android 原生对 cpu 的占用峰值在 26.8%,并且几乎是比较平稳的变化,而 flutter 对 cpu 的占用峰值达到了 35.5%,是一种很陡峭的形态,而后在大约十六七秒的时候,分别滑动了 listview, android 原生对 cpu 资源的占用峰值约 23%,而flutter约 22.5%。从图中也能够看得出,flutter 对 cpu 资源的占用是忽然之间占用很高,而 android 则相对平稳一些。
  • 内存占用 内存占用表现上二者都很类似,android 原生在启动时占用内存最高达到 58.1MB,而 flutter 则为 72MB,在滑动 listview 的时候,二者表现也很一致,都没有忽然出现很高的内存占用。达到稳定状态后,android 原生内存占用稳定在35MB,而 flutter 为 52.5MB。

debug 和profile 模式的性能测试若是你还不放心的话,那么下面我分别打包出用 flutter 和 android 原生构建出的release apk,而后将手机开启ROOT权限,以即可以用 Android Profiler 检测到这两个版本的进程,进行性能测试。下面看图:框架


android原生性能检测图

flutter 性能检测图

我在打开 app 并锁定当前进程后,分别在大约第 10 秒的时候,用手指轻轻滑动了 ListView,下面咱们分析下两种方式的资源占用状况。
工具

  • CPU资源占用 首先,咱们看 CPU 的占用,正常状况下,二者都没有占用多少 CPU 资源,当我滑动 listview 的时候,原生的大约会占用最高 7.7% 的 CPU 资源,而 flutter 版的则占用高一些,峰值大概在 18.8%。
  • 内存占用 原生的app内存占用维持在 12M 左右,而 flutter 版的则维持在 21M 左右,原生应用比 flutter 大约低了 9M 的内存占用。

从上边两种模式的性能检测结果分析咱们能够总结出,flutter 应用在 CPU 和内存的资源占用上会比原生方式多一些,因此单纯的从性能上来讲,android 原生是确定要优于 flutter 的,可是从用户体验上来讲,二者的滑动一样顺畅无比,几乎感受不到差异。性能

应用启动对比

启动是咱们衡量一个应用程序性能的重要指标,下面我先经过一个 gif 来演示下 android 版和 flutter 版启动 app 的体验:
测试

看得出,android 版和 flutter 版从启动体验上来讲几乎不相上下。这里我大胆作一个猜想,flutter app的启动机制和原生仍是如出一辙,因此调用启动 Application 也是建立 ActivityThread 而后最终执行 Application 的 onCreate 方法,因此从启动上来讲相差无几。下面我贴出 android 原生和 flutter 版的启动trance文件,动画


android原生trance文件

flutter trance文件

trance 文件几乎如出一辙,我一度都怀疑是本身弄错了,而后又仔细确认了一下没出错才放心,能够得出结论,flutter 版的启动流程跟原生是如出一辙的。

flutter 60帧/秒的刷新率测试

Flutter 官方指出其旨在提供 60 帧/秒的刷新率,60 fps 意味着大约平均每 16 ms 渲染一帧。咱们知道,当 UI 不能平滑的渲染时就会出现掉帧。举个例子,假若有一帧执行的东西太多,花费了 160 ms 的时间去渲染,这段期间就会产生丢帧现象,从而就会看到动画出现了明显的抖动。flutter release 版本是无法去测试渲染指数的,这里咱们仍是以 profile 模式运行,而后在用官方给咱们提供的 Flutter Inspector 工具去展现 fps 变化。下面看 Gif 图:

个人手机是小米Note 2,高通骁龙821处理器 4G 内存,性能大概属于 Anroid 阵营中上等。我打开 app 后先是平稳的滑动 listview,而后又快速的滑动,由图可看出,刷新率起初恒定在 60fps,当我快速滑动的时候,刷新率大约保持在58~59 之间,因此 flutter 官方所说 fps 恒定在 60fps 仍是可信的。

总结

经过以上的分析,咱们能够很明确的得出结论,android 原生在内存、CPU 资源占用方面要低于 flutter,而且安装包的体积也要小于 flutter,因此,不考虑其余因素,单纯从性能角度来讲,android 原生确定是要优于 flutter 的。但 flutter 也有它的优势,好比跨平台的开发、毫秒级的热重载等等,另外跨端开发也逐渐的流行起来,因此,咱们在学好android原生的基础上,对跨端开发也要抱有积极的心态。

参考

flutter中文网
flutter官网