网络请求各个指标的度量

Demo: https://github.com/zColdWater/iOSURLMetricsDemo/tree/master

2016 - 2019 WWDC 介绍这块的 PPT

https://github.com/zColdWater/Resources/blob/master/Images/711_nsurlsession_new_features_and_best_practices.pdf

https://github.com/zColdWater/Resources/blob/master/Images/713_advances_in_networking_part_2.pdf

内容

  • 效果

  • 一共有哪些指标?

  • 如何得到这些指标?

  • 总结

一,效果

比如我们向 https://github.com/ 发起一个 http 的请求,我们看下可以拿到哪些指标。

通过下面的这些指标,我们可以分析这些数据,得知我们的网络请求为什么比较慢,哪个阶段比较慢,再逐步优化。

httpmetrics.png

二,一共有哪些指标?

下面这个类,在 >= iOS10 的操作系统才可以运作,部分属性在 >= iOS13 才可以使用,我分别解释下他们的意思,但是 有些属性,我是真的不知道是干什么的,经过尝试,没有变化,这里我就不做解释。

如果觉得我是在这瞎 BB,可以去 navigate to NSURLSessionTaskTransactionMetrics define 自己查看,上面备注写的也很清楚了。

兄弟别慌,我刚开始看也懵逼,我给你看一张图,你就不懵逼了。在下方:

红字: 描述请求的整个过程。 白字: 对应上面的属性名字,各个阶段的位置。

是不是懵逼症状好一些了。

WechatIMG1009.png

三,如何得到这些指标?

这里还是要感谢苹果爸爸,虽然 iOS10 才给出来,但是现在已经 9102 年了,以支持最近 3 个版本的原则,我们的用户也应该都是 iOS10+ 的了,所以这个官方提供的功能,用的安全放心,还简单,不用去 hook 这,hook 那,然后得到的数据还不准,还让工程复杂化。

  1. 首先 调用 session 的构造器的时候,传入 delegate,这里比如就是 self。

  1. 其次让 self 遵守 NSURLSessionTaskDelegate 协议 实现如下代理方法

  1. Run 一下,看看 delegate 方法都捕捉到了哪些指标参数 。

四,总结

但是我发现一个问题,requestStartDate 比 requestEndDate 晚, 例如打印如下: requestStartDate:1576467073.038733 requestEndDate:1576467071.590589 按照 WWDC 上面所描述的,应该 start 先于 end,但是实际测试结果并不是这样。

我也弄不清楚为什么,将这个问题放在了 stackoverflow 上面: https://stackoverflow.com/questions/59350261/ios-why-is-requestenddate-earlier-than-requeststartdate 如果有知道的小伙伴告诉我下哈,谢谢啦。

补: 我自己回答了我的提问,在 OC 上面测试,我发现结果是正确的,但是在 swift 却是有问题的。

了解了一个完整的网路请求链路,以及每个链路的时间点,都是做什么,如何使用官方提供的 API 来进行收集数据,进行性能分析。

如果觉得自己写 Demo 测试验证麻烦,直接下载我上传的 Demo 没毒放心

Demo: https://github.com/zColdWater/iOSURLMetricsDemo/tree/master

最后更新于

这有帮助吗?