我正在努力优化我的Ffltter应用程序的API响应时间.我有一个API,我已经在其中添加了服务器级缓存,并且我使用Dio来满足我的API需求.

在postman 上测试时,响应时间为~100ms.在Chrome开发工具上获得了类似的指标.

问题是,当我测量Flutter 设备的响应时间时,所有的响应都是>250ms.经过判断,我发现每个请求都有大约200ms的连接等待时间.

No wait time on Postman req

Large connection wait time as seen on dev tool

我怎样才能减少上面的Flutter 等待时间?

我try 了切换库并重复使用建议的here和文档http中相同的HTTPS客户端,但后续请求的等待时间仍然相似.

var client = http.Client();
final res = await client.get(...);

如何避免这些连接延迟并获得最佳性能?如果缓存SSL、DNS Lookup等是解决方案,那么我该如何在Ffltter中做到这一点呢?

推荐答案

我已经弄清楚了上述问题的确切原因.

TLDR:Dio使用基于套接字的dart:io HttpClient,其默认idleTimeout为15秒.但在lib中,此超时被覆盖为3s,这就是为什么它们之间延迟超过3s的所有请求都必须打开另一个套接字连接.这导致在每个请求之前等待连接的时间很长.


我编写了一个DART程序来重复命中终点.我注意到,在第一次调用之后,所有请求的连接等待时间都为<;1ms.此外,对于我提出的13个GET请求,只有一个类型为ws的条目.请参见下图.

Delay of 2s between req, only one socket used

我在每个请求之间增加了4s的延迟,注意到现在每个请求都有一个连接等待时间,套接字连接(类型为ws)的数量等于请求的数量,即13.见下图.

Delay of 4s between req, 13 sockets used

深入研究后,我发现在默认情况下,Dio使用基于套接字的DART:Io HttpClient来发出所有请求.这意味着上面的套接字连接被Dio用来发出请求,连接在3s后关闭.

查看HttpClient和Dio lib的代码,我发现了一个参数-idleTimeout.它的缺省值是15s,但它是overridden to 3s in Dio,这就是为什么它们之间延迟超过3s的所有请求都必须打开新的套接字连接.这导致在每个请求之前等待连接的时间很长.

Flutter相关问答推荐

未处理异常:字符串类型不是值类型子类型的子类型'

ListTile未正确显示在flutter中

获取屏幕大小的滚动视图与动态大小?

如何在Firebase项目中更改包名称和包ID

在fltter_widget_from_html中启动url

Flutter 图标记移动

遇到图像路径格式问题

Flutter API请求BadState响应

在Fighter中,我如何在窗口的顶部和底部排列Widget?

如何从flutter中不同类别的列表中获取所有产品

如何在flutter中加载并显示adx锚定的自适应广告?

仅在获取(读取)、Provider 时,Firestore 中的数据为空

如何计算 Firestore 集合中的文档数量?

在 Dart 中使用隔离时访问外部范围内的变量

为什么容器会填满整个空间?

Flutter 用户过滤器

在 FAB 上添加表格小部件单击 FLUTTER

如何在Flutter 中制作自定义微调器?

在 Flutter 应用程序中全局使用 assets 文件夹

如何将 pushNamed 与 Dismissible Widget 一起使用并查看背景透明第一页