NSURLSessionDataTask导致CPU使用率高

4
我正在使用 NSURLSessionDataTask 将数据输入到后台音频流中(在这种情况下并不相关)。我遇到的问题仅与下载代码有关 - 我已经将其隔离并简单地丢弃数据,因此系统的其他部分对其没有影响。我观察到,如果我使用由 backgroundSessionConfigurationWithIdentifier 创建的 config (NSURLSessionConfiguration) 创建 NSURLSession,则下载时的 CPU 使用率很低(<5%)。虽然这样可以正常工作(95% 的时间),但我认为这不是一种受支持的配置。而且我只需要在应用程序在前台运行时让它工作。因此,我使用使用 ephemeralSessionConfiguration 创建的配置创建 NSURLSession,这也停止了它将磁盘用作后台缓存,因此应该使用最少的 CPU。但是,在这种情况下,CPU 使用率却飙升到 70% 至 80%。同样的高 CPU 使用率也会发生在使用 defaultSessionConfiguration 创建的配置或者使用 [NSURLSession sharedSession] 获取共享 NSURLSession 的情况下。每种情况下的数据吞吐量都没有改变 - 只是不在后台运行会导致高 CPU 使用率。我正在运行 iOS 9.1,使用 SDK 9.1。它在模拟器和设备上都会发生。更新11月16日——正如George所指出的那样,似乎 didReceiveData 方法需要大量计算资源。我找到的唯一处理方法是添加一个调用。
[NSThread sleepForTimeInterval:0.25];

这似乎是一个相当激进的措施,但它将下载时的CPU占用率从60-80%降至10-12%左右。该下载在它自己的线程中运行,因此只会减缓下载速度。实际上,它并没有真正减缓 - 只是didReceiveData以更大的块接收数据而已。在我的应用程序中,这并不重要。


我在 Mac OS 10.11 上遇到了同样的问题。下载单个文件时,占用了一个核心的30-50%。使用默认或临时配置时,使用情况取决于网络性能。似乎每毫秒会多次调用委托方法“URLSession:dataTask:didReceiveData:”!切换到后台配置可以显著降低这种情况。我已尝试调整任务的优先级属性,但迄今为止没有任何效果。也许如果还有其他资源争夺,它可能会有所作为。 - George
1个回答

1

您应该将NSURLSessiondelegateQueue设置为低优先级队列(即dispatch_get_global_queue(QOS_CLASS_BACKGROUND,0))。我认为问题不是处理实际上需要更多的CPU,而是因为它发生得更频繁,因为它要分派到的队列是高优先级。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接