Vadaski的小屋

「译」Performance testing of Flutter apps

原文链接:Performance testing of Flutter apps 作者:Filip Hracek (from Flutter team)

Flutter 在默认状态下就能运行得非常快,这点非常好! 但是否这就意味着你完全不需要考虑性能呢?

答案是否定的,编写一个速度非常慢的 Flutter 应用是完全可能的。然而,另一方面你也可以充分利用这个框架,让你的 app 不仅快速,高效,而且使用更少的 CPU 时间和电量。

这就是我们想要的!在一个有意义的指标上来比较两个版本的应用在统计上明显的差异

在 Flutter 中有一些性能优化的通用指导原则:

你可能很难相信,对于大多数性能优化的问题来说,它们的答案统统指向了这句话——“它究竟取决于什么?”。对于特定 Widget 是否值得进行特定优化,并付出维护成本?在特定情况下的特殊处理是否合理?

对于这些问题唯一有用答案是测试和测量。量化每个选择对性能的影响,并根据该数据做出决定。

好消息是 Flutter 提供了出色的性能分析工具,例如包含 Flutter Inspector 的 Dart DevTools(目前还处于预览版),或是 Android Studio 中的 Flutter Inspector(安装了 Flutter 插件下)。你可以使用 Flutter Driver 操作应用,并在 Profile 模式下保存性能信息。

然而坏消息是,现在的手机实在是太过智能了。?

管理器的问题(Governors)

系统级守护进程需要根据当前负载调整 CPU 和 GPU 单元的速度,但是 iOS 和 Android 的管理器却很难量化 Flutter 应用的性能。总的来说这还是一件好事,因为它确保了平稳的性能,同时也消耗尽可能少的电量。

然而缺点是你完全可以通过提高其效率以显著加快应用的运行速度。

下面的例子中,你可以看到如何在应用中循环打印一些无意义的 print 语句,使得管理器切换到更高的档位,从而让应用运行更快速,性能更加可预测。

管理器的问题:在默认情况下,你无法相信这些数字。在上面这个盒子图中,我们在 x 轴上进行单独运行(用它们开始的确切时间标记),并在 y 轴上表示构建时间。正如你所看到那样,当我们引入一些完全不必要的打印语句时,它竟然会缩短(而不是增加) build 时间。

在这个实验中(上图),更差的代码反而导致了更快的构建时间,更快的光栅化时间和更高的帧率。如果客观上更差的代码会得到更好的性能,那么你就不能遵循这些指标。

上面仅仅是为了解释为何移动应用性能基准不直观,以及测试困难的一个例子。

接下来,我将分享一些 Google I/O app 上 Flutter 的例子,Developer Quest

基本建议

CPU / GPU 管理器

正如我们刚才所说的,现代操作系统根据负载和一些其他的启发式调整每个 CPU 和 GPU 的频率。(例如,触摸屏幕通常会让 Android 手机将其优先级置于更高的档位。)

在 Android 上你能够直接关掉这些管理器,我们称之为“scale locking”。

#!/usr/bin/env bash
GOV="userspace"
echo "Setting CPU governor to: ${GOV}"
adb shell "echo ${GOV} > /sys/devices/system/cpu/cpu${CPU_NO}/cpufreq/scaling_governor"
ACTUAL_GOV=`adb shell "cat /sys/devices/system/cpu/cpu${CPU_NO}/cpufreq/scaling_governor"`
echo "- result: ${ACTUAL_GOV}"

Flutter Driver

Flutter Driver 能够自动执行应用。你可以阅读 flutter.dev 上性能分析的文章,了解如何使用它来分析应用。

for i in {1..100}; do flutter drive --target=test_driver/perf.dart --profile; done

时间轴(Timeline)

时间轴是你运行 profile 模式下输出的原始资料。Flutter 将此信息转储到可被 chrome://tracing 加载的 JSON 文件中。

度量

最好能看尽可能多的指标,但我发现一些相比其他更有用的指标。

结论

当这些都设置好了之后,你就能够自信地比较提交和实验。下面,你可以看到一个很常见困境的答案:“这种优化值得维护开销吗?”

我认为对于这个情况来说,答案是肯定的。只需几行代码,我们应用的每个自动测试平均可以减少 12% 的 CPU 时间。

然而,本文的主要内容是,不同的测量方式可能会反映处非常不同的东西。尝试过于宽泛地推断性能测量也许十分符合直觉,但却是错误的。

换句话说:“它究竟取决于什么”。我们应该信奉这句话。

以上便是翻译的全部内容,我认为这篇文章对我们构建高效的 Flutter 应用具有很大的指导意义,所以便翻译出来分享给大家。

如若有译误还请指出。

退出移动版