Flutter 中 async 操作符的隐藏成本

参考原文:The hidden cost of async operations in Flutter/Dart | by Rei | ITNEXT

本文主要讲解 void 和 async 一起使用时,容易忽略掉的两种情况而导致的性能问题。

冗余 async

我们会不自觉将如下两种写法等价

不就是多个 async 么,没啥大不了的。

那么事实真的是"等价"的么?

这里用 Dart 官方benchmark_harness基准测试工具测试一把两个方法耗时情况。

benchmark_harness可以通过覆盖 exercise 方法来上报 run()一次的平均时间(单位是微秒),默认使用 10 次迭代,我们修改成 100K 次。

运行结果:

表明方法 b 冗余的 async 关键字导致比方法 a 慢(143 倍,当然每个机器不一样这个倍速不同)很多,但是确实导致应用程序运行变慢很多。

上述情况容易发生的原因,跟 void 返回有关,不管加不加 async,编译器都不会报错,大不了就是个警告,无视之~~~ 。如果返回值是 int, 这种可能就会直接报错,开发者自然会去修改。

但有返回值的情况下,需注意如下冗余 async 情况, 比如 f() 的时间也会高于 e,不必要的 async 还是不要冗余加。

await vs unawaited

还是返回是 void 的情况,这里我们加上上述情况中心心念念的 Future 来做另外一个实验。

一样,啥都不干,规规矩矩加上 Future。然后来看不同调用差异,方法 c 用 await 方法 d 用 unawaited。

运行结果:

结果显而易见,unawaited 更快。

unawaited 作用是启动一个 Future,但是不等它完成就继续。

比如日志记录,通常情况下知道日志记录会在某个时刻完成,而不需要等待它完成就可以了。这个时候可以用 unwaited。

简单来说,Future 有非错误结果,但是不关心它的这个结果,就可以用 unwaited。 如果这个过程中有错误结果,可能捕捉不到了。

那么如何解决平时遇到上述情况呢?

解决办法

通过 linter 规则来阻止此类问题。

下面是 linter 的一些并发规则

说到这里还是有点心虚,毕竟规则也可以无视,

  1. 可增加到代码提交规范
  2. 可增加到 CI/CD 流程中

源码传送门

相关推荐
自由能燃气设备15 分钟前
【无标题】硅铸铝锅炉漏水只能整机换吗?商用燃气热水锅炉的寿命与 10 年成本账
性能优化
美狐美颜SDK开放平台10 小时前
准备开发直播APP?视频美颜SDK接入前的十项检查清单
android·ios·音视频·直播美颜sdk·视频美颜sdk
传奇开心果编程10 小时前
【Jetpack Compose娓娓道来】第26课:Repository模式与数据层设计——数据的唯一入口
android·移动开发·1024程序员节·jetpack compose·编程语言理论·编程框架·声明式ui
三少爷的鞋15 小时前
Kotlin 协程,重点就在「协」这个字上
android·kotlin
好的佩奇15 小时前
Dart 之模式
android·flutter·dart
CCblandy16 小时前
前缀缓存命中率不靠引擎靠排列:本机仿真 3 轮,易变字段放开头 98.0%→0.0%
人工智能·python·算法·自然语言处理·性能优化
淡淡的香烟17 小时前
Flutter实现多语言切换
android·flutter·1024程序员节
Random Glow18 小时前
聚簇索引 vs 二级索引:回表、覆盖索引、索引下推
数据库·mysql·性能优化·innodb·1024程序员节·索引优化
AIsoft_868919 小时前
手机视频转文字工具清单:哪些APP支持录屏识别
android·音视频
_祝你今天愉快21 小时前
Paint Cavans高级绘制:[一]Paint画笔高级应用
android