NSURLSessionDataTask 导致高 CPU 使用率
Posted
技术标签:
【中文标题】NSURLSessionDataTask 导致高 CPU 使用率【英文标题】:NSURLSessionDataTask causes high CPU usage 【发布时间】:2015-10-28 17:34:30 【问题描述】:我正在使用NSURLSessionDataTask
将数据馈送到后台的音频流中(在这种情况下并不真正相关)。
我遇到的问题仅发生在下载代码上 - 我已将其隔离并简单地丢弃数据,因此系统的其他部分不会影响它。
我观察到,如果我使用 backgroundSessionConfigurationWithIdentifier
创建的配置 (NSURLSessionConfiguration
) 创建 NSURLSession
,则下载时的 CPU 使用率很低 (
因此,相反,我使用使用ephemeralSessionConfiguration
创建的配置创建NSURLSession
,这也会阻止它使用磁盘作为后台缓存,因此应该使用最少的 CPU。但是,在这种情况下,CPU 使用率会飙升至 70% 到 80% 之间。
使用defaultSessionConfiguration
创建的配置甚至使用[NSURLSession sharedSession]
获取共享的NSURLSession
也会出现同样的高CPU 使用率。
每个场景之间的数据吞吐量都没有变化——只是不在后台运行会导致 CPU 使用率很高。
我正在使用 SDK 9.1 在 ios 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:`` 每 毫秒 被调用多次!切换到后台配置会大大降低。我已经尝试过使用任务的优先级属性,但到目前为止它对我的设置没有影响。也许如果有其他东西在争夺资源,它会。 【参考方案1】:您可能应该将NSURLSession
的delegateQueue
设置为低优先级队列(即dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)
。我认为问题不在于处理实际上占用更多CPU,而是它发生得更频繁,因为它正在调度的队列是高优先级。
【讨论】:
以上是关于NSURLSessionDataTask 导致高 CPU 使用率的主要内容,如果未能解决你的问题,请参考以下文章
NSURLSessionDataTask 内存警告应用程序崩溃
使用 NSURLSessionDataTask 显示文件下载进度
NSURLSessionDataTask 中的 popViewController 动画工作缓慢