原文作者:medium.com/@shaza
发布时间:2020年7月31日 - 6分钟阅读
快速是Flutter的关键支柱。本文重点介绍了Flutter社区的人们从2019年下半年开始实施的性能改进。(是的,这已经晚了,但迟到总比不迟到好!)
如果你在2020年对性能有帮助,我们会在未来的文章中介绍。我们希望与您--Flutter社区分享这些,能激励您帮助我们完成这项工作!
2019年第四季度(10-12月)
量化的改进
快速滚动浏览大型图像时,内存减少70%。
快速滚动浏览大型图像时,内存减少70%
撰稿人:liyuqian, dnfield, chinmaygarde
- PR 14265:清理IO线程 清理IO线程GrContext
- PR 46184: 快速滚动大图片的记忆测试
- 仪表板:将fast_scroll_large_images__memory diff-median减少70%(400MB至120MB)
- 问题19558:IO线程GrContext内存需要清理
简单iOS动画的CPU/GPU使用率降低40%。
贡献者: flar, liyuqian, hixie, chinmaygarde
- PR 14104:为支持屏幕回读,重做更简单的屏幕外条件
- PR 13976: 根据需要动态确定是否使用屏幕外的表面
- PR 31865: 简单的动画在iPhone 6上的CPU/GPU/电源使用率很高(约20%)
- 40%(23%-CPU-14%-GPU到13%-CPU-8.5%-GPU)减少简单动画_perf_iphonexs cpu_percentage, gpu_percentage
41%的小车性能加速
贡献者:garyqian, Li yuqian, justinmc
- PR 46720: 传递_caretPrototype防止缓存丢失
- PR 46720:第90个百分位数的帧构建时间加快了41%(从6.709ms到4.756ms)
- 修正问题24522:Caret性能差,每帧GPU时间高
通过修复光栅缓存节流,列表滚动速度提升10%。
贡献者:Li yuqian, chinmaygarde, flar, cyanglaz, zsunkun
- PR 31865: 简单的动画在iPhone 6上的CPU/GPU/电源使用率很高(约20%)
- PR 13710: 修复图片光栅缓存节流
- PR 45050: 为图片光栅缓存增加一个敷衍测试
- 修正了一个blocker问题,43083:列表滚动不流畅,用PR 13710:修复图片光栅缓存节流问题
缓存基准加载时间加快37倍(仪表盘)
贡献者:caseyhillers, tvolkert, digiter, jonahwilliams。
2.3倍的速度来构建APKs。
贡献者:Jonahwilliams, blasten, zanderso, Xster.
- PR 44534:通过同时运行gen_sapshot来提高构建APK的性能(约50%)
- 在目标平台android-arm、android-arm64和android-x64的APK版本构建中,速度提高了2.3倍(140s到60s)
每次Flutter引擎提交时记录的性能指标+103个。
贡献者:liyuqian, digiter, keyonghan, godofredoc, cbracken
减少20%的应用程序大小
贡献者: mraleph, alexmarkov, rmacnak-google, mkustermann, sstrickl, aartbik。
- 3%来自于StackMaps的Lift PC抵消
- 2.58%来自于进一步压缩之前在StackMaps中的信息
- 在可能的情况下,从Canonicalize CompressedStackMaps有效载荷中提取1%
- 2%,从完全启用裸模式下的重复数据删除指令开始
- 0.3% 从不为需要args描述符的函数生成单态序言开始。
- 1%,来自于放弃多余的空初始化存储
- 6%来自减少指令的对齐度和删除一些调试陷阱指令
- 在调用存根期间调整CSP,而不是在每个函数的序幕中调整1.2%。
- 1%来自ARM64:R22块用来存放NullObject()
- 2.5%来自全方案恒定传播
- 0.77%来自死码消除
Dart FFI性能提升108倍
贡献者:dcharkes、mkustermann、sjindel、alexmarkov。
- Gerrit 120661.优化静态已知类型的Pointer操作。优化静态已知类型的Pointer操作
- Gerrit 119645: 指针优化索引加载和存储
- Gerrit 121580: 允许在AoT中内嵌力优化函数
紧缩代码的性能提升10-15%
贡献者:Aartbik, mkustermann, mraleph。
- Gerrit 117200: 环路分析和改进BCE
- golem armv7,和TypedData Bench的性能提升10-15%:Gerrit 117200: 循环分析和BCE改进
使用新的增量式序列化器,Flutter测试速度提高2.2倍
贡献者:Jensjoha、Alexmarkov。
- Gerrit 121121: 默认启用增量序列器
- 在 "颤动测试 "中加速2.2倍(3:38至1:39)
通过给Dart VM JIT提供内联提示,使内核二进制序列化速度提高10%
撰稿人:Jensjoha, Johnniwinther
对重度异步代码的性能提升30%
撰稿人:Cskau-G、MKustermann、Mraleph。
其他改进
修正了在iOS上使用PlatformView时的内存泄漏问题
修正了iOS上播放动画时的内存泄漏问题
修复了更多的iOS内存泄漏问题
开始改版flutter.dev上的性能页面,并添加了测量应用大小的说明
纠正了第一帧等待逻辑和测量的问题
- [PR 37192:Reland "修正追踪和驱动中的第一帧逻辑(#35297)"](github.com/flutter/flu…
- 修正了问题47108:在iOS系统中播放动画时内存泄漏的问题
DevTools添加了支持异步和记录跟踪的全时间线模式
IntelliJ插件修复了120FPS支持
感谢ByteDance,许多时间线追踪得到了改进
- Gerrit 127920: [timeline] 在android平台的trace中增加对时间轴异步事件的支持
- Gerrit 128200: [时间轴]systrace可支持vm事件
- Gerrit 127921: 使用systrace记录时间轴事件时,支持更多同步事件
- PR 14323:修复在systrace中记录事件时缺少的API流
- PR 14521:支持时间轴可以在发布模式下启用
- PR 14319:修复flutter引擎启动时间的时间轴事件缺失
- PR 47742:修正时间轴摘要的持续时间事件
- Gerrit 131360: 支持时间轴转换为iOS平台的痕迹
- PR 16520:支持无尽的跟踪缓冲区
- PR47419:支持时间轴的无休止记录
2019年第三季度(7月至9月)
量化的改进
矩形和点变换速度提高1.5-5倍
- PR 37275.优化matrix_utils中的transformRect和transformPoint方法。优化matrix_utils中的transformRect和transformPoint方法
- 在
MatrixUtils_affine_transformRect_iteration中,速度提高了5.3倍(2300ms到430ms) - 在
MatrixUtils_affine_transformPoint_iteration中,速度提高了1.5倍(466ms到320ms)
在iPhone X/Xs上滚动时,N/2-1的漏帧数较少。
贡献者:Li yuqian, chinmaygarde, gaaclarke
- github.com/flutter/eng…
- PR 12385:Reland "平滑化iOS不规则输入事件的传递"
- 在N个帧的卷轴中,将最坏情况下的错过帧数从N/2减少到1。实际上,在修复之前,平均漏掉N/10帧。
- 修正了我们投票最多的一个问题: 问题31086: 由于输入事件传递不正常,iPhone X、Xs设备上的滚动性能明显下降
并行初始化使发动机启动和关闭速度提高15%。
贡献者:Gaaclarke, chinmaygarde, Li yuqian。
- PR 10182: 允许初始化并行化,使flutter启动速度更快
- 在BM_ShellInitializationAndShutdown中,速度提高了1.16倍(3829377 ns到3286713 ns)
启动速度加快14.57毫秒,着色器预热占用内存减少8MB。
贡献者:Gaaclarke, Li yuqian, dnfield
- PR 36482: 只在100x100的表面上绘图,加快了着色器的热身
- 读取/转换像素时,启动时可节省14.57ms(18.848ms到4.279ms)
- 保存8MB(39220KB至31184KB)的起始中间值内存
- 在终端介质内存中节省4MB(45034KB至40980KB)
减少1.02%-8.04%的代码大小。
贡献者:Johnniwinther, aartbik, rmacnak-google, jensjoha, alexmarkov, mkustermann
- dart-review.googlesource.com/c/sdk/+/118…
- dart-review.googlesource.com/c/sdk/+/112…
- dart-review.googlesource.com/c/sdk/+/118…
- 在armv8 animation_bench_instructions_size中,-8.04% (5.57MB到5.13MB) 。
- 在 armv7 flutter_gallery_readonlydata_size 中,-2.7% (2.10MB 到 2.05MB) 。
- 在 armv7 layout_bench_instructions_size 中 -1.22% (2.10MB 至 2.05MB)
在Fuchsia FPS上的Flutter增加了2倍;改善了帧调度。
贡献者:Dreveman、Amott、Roswang、Mikejurka
- fuchsia-review.googlesource.com/c/topaz/+/2…
- fuchsia-review.googlesource.com/c/topaz/+/2…
- fuchsia-review.googlesource.com/c/topaz/+/3…
- fuchsia-review.googlesource.com/c/topaz/+/3…
- fuchsia-review.googlesource.com/c/topaz/+/3…
- fuchsia-review.googlesource.com/c/topaz/+/3…
量化的回归修正
iOS上BackdropFilter的速度提高了3倍。
- skia-review.googlesource.com/c/skia/+/23…
- skia-review.googlesource.com/c/skia/+/23…
- github.com/flutter/flu…
- 在GM_savelayer_with_backdrop中加速3倍(110ms到34ms)
- 修复退化问题 github.com/flutter/flu…
为了实现一些巨大的改进(比如3倍),旧状态下的糟糕表现可能与2019年第三季度(7月-9月)的努力工作起到了同样重要的作用。我们也将一些改进标记为同样大的回归的非平凡修复。尽管如此,我们还是感谢这样的工作。如果没有它,我们会继续有糟糕的性能和回归。我们不希望大的改进让小的改进相形见绌。他们只是一开始就没有非常糟糕的旧性能,从某种意义上说这是一件好事。
其他改进
- DevTools支持可变的显示刷新率(如60 FPS、120 FPS等)
- VSCode插件对项目的扫描现在是异步的,这应该会提高扩展的激活速度,并减少触发VS Code的 "扩展导致高CPU "警告的机会。(#1840/#2003/#1961)
- iPhone Xs被加入Flutter设备实验室进行基准测试。
结论
57%的受访者对Flutter非常满意。总共有94%的人表示积极满意。
由于我们社区的这些贡献,对Flutter移动性能积极满意的用户比例从2019年第三季度的85%增加到2020年的92%。尽管我们已经尽了最大努力,但本次更新可能会遗漏2019年第三季度至第四季度的一些性能贡献。请不要犹豫,让我们知道任何遗漏的贡献,我们将把它们放在下一次更新中。
感谢Filip Hracek。
通过( www.DeepL.com/Translator )(免费版)翻译