网络耗时分段统计方案(仅数据计算部分)

主要方案为使用apple在 iOS 10 推出一个API:

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didFinishCollectingMetrics:(NSURLSessionTaskMetrics *)metrics API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));

其中该代理中的metrics参数类中包含了如下数据:

@interface NSURLSessionTaskMetrics : NSObject
 
/*
 * 数组包含为任务执行期间创建的每个请求/响应事务收集的对应数据。
 */
@property (copy, readonly) NSArray<NSURLSessionTaskTransactionMetrics *> *transactionMetrics;
 
/*
 * 从任务创建时间到任务完成时间的间隔。
 * 任务创建时间是实例化任务的时间。
 * 任务完成时间是指任务即将将其内部状态更改为已完成的时间。
 */
@property (copy, readonly) NSDateInterval *taskInterval;
 
/*
 * 重定向次数
 */
@property (assign, readonly) NSUInteger redirectCount;
 
@end

而其中包含的每次请求/响应的类是我们此次关注的重点,该类包含了如下属性:


各个环节示意
字段 解释
secureConnectionEndDate 如果使用了加密连接,那么secureConnectionEndDate是安全握手完成之后的结束时间
connectEndDate 用户代理完成与服务器的连接建立之后(包括与安全相关的握手和其他握手完成)的结束时间
connectStartDate 用户代理开始与服务器建立连接开始的时间
secureConnectionStartDate 用户代理立即开始TLS握手之前的开始时间
requestStartDate 用户代理立即开始请求源之前的开始时间,无论是从服务器还是从本地资源检索资源
fetchStartDate 返回用户代理开始获取资源的时间,无论该资源是从服务器还是从本地资源中检索到的。但是需要注意:如果使用了持久连接或从本地资源中检索了资源,则domainLookupStartDate、connectEndDate、domainLookupEndDate、connectStartDate、secureConnectionStartDate、secureConnectionEndDate指标将设置为nil
domainLookupStartDate 返回用户代理立即开始资源查找之前的时间,即DNS开始时间
domainLookupEndDate 返回资源查找完成后的时间,即DNS结束时间

而根据整个网络请求链路,我们新增记录了几个时间点:

字段 解释
addToQueueStartDate 网络请求任务被添加到队列里的时间节点
requestFailedEndDate 网络请求失败的结束时间节点

而以上这些数据恰恰帮我们完成了对应阶段耗时操作的统计过程:

字段 解释 计算方式
transmitTime 包含request和response时间 responseEndDate与requestStartDate的时间差
queueTime 排队时间 使用fetchStartDate与自定义addToQueueStartDate的时间差
dnsTime DNS解析耗时,需注意可能为0,例如使用了持久连接或从本地资源中检索了资源,则并不会重新进行DNS过程 domainLookupEndDate与domainLookupStartDate的时间差
connectTime 包含tcp和ssl连接时间,需注意可能为0,例如使用了持久连接或从本地资源中检索了资源,则并不会重新进行DNS过程 secureConnectionEndDate与secureConnectionStartDate的时间差
connectionReleaseTime(已去除) 整个http网络连接耗时 connectEndDate与connectStartDate的时间差
callTime 整个网络请求过程的耗时 total 直接采用NSURLSessionTaskMetrics类中的taskInterval参数
callFailedTime 与callEndTime对应 只不过请求失败了,此时是由于请求超时错误,与connectFailedTime所代表的的请求出现的异常不同 requestFailedEndDate与fetchStartDate的时间差

具体过程请参照下图:


实现流程图
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • BAT面试题复习 http协议 http协议是无状态无连接; 无状态:指的是http协议无法保存客户机的信息,比如...
    JasonChiu17阅读 2,789评论 10 67
  • 非常好的文章,怕博主删除,再也找不到这么好的文章了,所以复制了一份,博主是2016年写,但是是到现在为止看到的,思...
    吭声_cfdc阅读 1,858评论 0 4
  • 一.HTTP HTTP是超文本传输协议 1.请求报文的格式 请求行:方法(get、post)、url(请求的地址)...
    蔚尼阅读 686评论 0 2
  • 这边文章不是讲Instruments 的,另外两种检测内存泄漏的方法内存泄漏。其实有两种泄漏。第一个是真正的内存泄...
    清风沐沐阅读 885评论 0 0
  • 跟thread扯上关系就不成立 if(dx<x+25 && x+25<dx+dk){//在挡板范围之内 i...
    情义难解阅读 143评论 0 0