12

我正在尝试执行尽可能多的同时 http 下载 IPad2 ( ios6.0 )。这纯粹是为了测试此设备上的可能性。甚至对 GUI 性能不感兴趣(如果它没有响应则不重要)

我创建了一个特殊的 HTTP 服务器,它向客户端发送 x 分钟的数据。接收到的数据并不重要。我只是测量速度和并发下载的数量。我已经实现了 2 种不同的方式来调度 12 个 HTTP 请求。

NSOperation

一种是通过在队列中使用 NSOperation 对象并将 NSOperationQueueDefaultMaxConcurrentOperationCount 设置为 12 来完成

NSThread

第二种实现是通过创建 12 个 NSThreads 来执行同步 http-request。

请求都发送到相同的目标 IP。

观察

我观察到的是,在这两种情况下,第 6 到第 12 个请求都会获得 TimeOut(错误代码 -1001)。如果 1 将超时值设置为 80.0 秒,我看到第 1 次下载完成后第 6 次下载开始。

问题

  • IOS 对同时下载的数量有限制吗?
  • 还有其他方法可以执行这些并发下载吗?
  • 有没有办法将线程绑定到核心(这样它就不会受到中断,如 C++ 中的 cpuaffity )或线程优先级
4

4 回答 4

20

您最多可以有 5 个同时连接到同一台服务器。这是一个 iOS 固定限制,可能是因为一些 http 协议限制。你可以在这里阅读更多信息。

于 2013-02-26T12:41:29.080 回答
4

万一有人还在寻找,这只是一个碰撞。我在我的 iPhone6S+ 上看到它是 4 个同时。这是我的测试步骤:

  • I wrote a PHP script that does sleep(10) before echoing something back.
  • I added a button (so I can execute well after startup)
  • Hitting that button triggers 30 simultaneous NSURLConnections (synchronous requests, but each in a separate thread), and an NSLog.
  • The completion for each does an NSLog

The results are like clockwork. The first responses (4 of them) come back 12 seconds after the request (presumably 2 seconds to turn the radio on or whatever), but then each subsequent block of 4 responses come 10 seconds after the prior block of 4. All 4 at a time.

Hope that helps someone.

于 2016-07-27T21:56:24.963 回答
3

After looking into this for a project I found something in Apple's documentation for NSURLSessionConfiguration.

From Apple's documentation --

This property determines the maximum number of simultaneous connections made to each host by tasks within sessions based on this configuration.

This limit is per session, so if you use multiple sessions, your app as a whole may exceed this limit. Additionally, depending on your connection to the Internet, a session may use a lower limit than the one you specify.

The default value is 6 in OS X, or 4 in iOS.

于 2016-08-19T21:02:17.300 回答
1

IOS 对同时下载的数量有限制吗?

顺便说一下,这是基于每个服务器的限制,而不是 iOS 限制。如果您尝试同时从不同的服务器执行此操作,您会发现您可以超出当前限制。

还有其他方法可以执行这些并发下载吗?

显然,您也可以使用 GCD 做一些事情,手动管理并发请求,但我认为这NSOperationQueue是一个很好的解决方案,并且没有理由再进一步研究。我当然也看不出使用线程有什么好处。

随着并发请求数量的增加,您应该对总经过时间进行基准测试,但我相信您会遇到收益递减点。仅仅拥有更多的并发请求并不能确保更好的总体性能。

于 2013-02-26T14:16:05.160 回答