为什么NSURLSession:delegate:明显慢于NSURLSession:completionHandler:?

时间:2017-03-21 12:35:11

标签: performance cocoa optimization nsurlsession nsurlsessiondatatask

我注意到我的应用程序连接到远程资源的方式比Web浏览器慢,或者cURL并决定进行一些挖掘。

我一直在使用NSURLSession sessionWithConfiguration:delegate:来处理服务器响应,并决定尝试使用NSURLSession dataTaskWithRequest:completionHandler:。测试方法如下:

-(void)connectWithDelegate:(NSString *)url
{
    semaphore = dispatch_semaphore_create(0);
    session = [NSURLSession sessionWithConfiguration: [NSURLSessionConfiguration defaultSessionConfiguration]
                                            delegate: self
                                       delegateQueue: nil];

    NSMutableURLRequest* req = [NSMutableURLRequest requestWithURL: [NSURL URLWithString: url]
                                                       cachePolicy: NSURLRequestReloadIgnoringLocalCacheData
                                                   timeoutInterval: 60.0];


    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest: req];

    [dataTask resume];
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
}
- (void)connectWithCompletionHandler:(NSString *)url
{
    semaphore = dispatch_semaphore_create(0);
    session = [NSURLSession sharedSession];
    NSMutableURLRequest* req = [NSMutableURLRequest requestWithURL: [NSURL URLWithString: url]
                                                       cachePolicy: NSURLRequestReloadIgnoringLocalCacheData
                                                   timeoutInterval: 60.0];

    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:req completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error){
        if (!error)
            dispatch_semaphore_signal(semaphore);
    }];

    [dataTask resume];
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
}

使用一系列不同的网络条件重复运行这些测试,connectWithCompletionHandler:方法始终优于connectWithDelegate:。在慢速连接上,返回速度可快6倍。

可以找到完整的测试代码here

在5Mb / s链路上运行此测试20次,延迟为50 ms,connectWithCompletionHandler:平均连接时间为0.6秒,connectWithDelegate:平均连接时间为2秒

这两种方法之间响应时间的差异是什么原因......?

0 个答案:

没有答案