Максимизируйте количество одновременных http-загрузок
Я пытаюсь выполнить как можно больше одновременных http-загрузок IPad2 ( ios6.0). Это чисто для тестирования того, что возможно на этом устройстве. Даже не заинтересован в производительности графического интерфейса (не важно, если он не отвечает)
Я создал специальный HTTP-сервер, который за x минут отправляет данные клиенту. Полученные данные не имеют значения. Я просто измеряю скорость и количество одновременных загрузок. Я реализовал 2 разных способа планирования 12 HTTP-запросов.
NSOperation
Один выполняется с помощью объектов NSOperation в очереди и установить NSOperationQueueDefaultMaxConcurrentOperationCount в 12
NSThread
Вторая реализация заключается в создании 12 NSThreads, которые выполняют синхронный http-запрос.
Все запросы отправляются на один и тот же IP-адрес назначения.
наблюдение
Я наблюдаю, что в обоих случаях с 6-го по 12-й запрос получают TimeOut (код ошибки -1001). Если 1 установить значение тайм-аута на 80.0 секунд, я вижу, что 6-я загрузка начинается, когда 1-ая завершена.
Вопросы
- Есть ли в IOS ограничение на количество одновременных загрузок?
- Есть ли другой способ выполнить эти одновременные загрузки?
- Есть ли способ привязать поток к ядру (чтобы он не получал прерывания, как cpuaffinity в C++) или приоритет потока
4 ответа
Вы можете иметь максимум 5 одновременных подключений к одному серверу. Это фиксированный предел iOS, и, вероятно, это связано с некоторыми ограничениями протокола HTTP. Вы можете прочитать немного больше информации здесь.
Просто удар по этому, на случай, если кто-то все еще ищет. Я вижу, что это 4 одновременно на моем iPhone6S+. Вот мои тестовые шаги:
- Я написал PHP-скрипт, который делает sleep(10), прежде чем что-то возвращать.
- Я добавил кнопку (чтобы я мог хорошо выполнить после запуска)
- Нажатие на эту кнопку запускает 30 одновременных NSURLConnections (синхронные запросы, но каждый в отдельном потоке) и NSLog.
- Завершение для каждого делает NSLog
Результаты как по маслу. Первые ответы (4 из них) возвращаются через 12 секунд после запроса (предположительно, 2 секунды для включения радиоприемника или чего-либо еще), но затем каждый последующий блок из 4 ответов приходит через 10 секунд после предыдущего блока 4. Все 4 в время.
Надеюсь, что это помогает кому-то.
После изучения этого проекта я нашел кое-что в документации Apple для NSURLSessionConfiguration.
Из документации Apple -
Это свойство определяет максимальное количество одновременных подключений к каждому хосту задачами в сеансах на основе этой конфигурации.
Это ограничение на сеанс, поэтому, если вы используете несколько сеансов, ваше приложение в целом может превысить это ограничение. Кроме того, в зависимости от вашего подключения к Интернету, сеанс может использовать более низкий предел, чем тот, который вы указали.
Значение по умолчанию - 6 в OS X или 4 в iOS.
Есть ли в IOS ограничение на количество одновременных загрузок?
Между прочим, это ограничение для каждого сервера, а не для iOS. Если вы попытаетесь сделать это с разных серверов одновременно, вы увидите, что можете превысить свой текущий лимит.
Есть ли другой способ выполнить эти одновременные загрузки?
Очевидно, что вы могли бы что-то сделать и с GCD, вручную обрабатывая параллельные запросы, но я думаю, NSOperationQueue
является отличным решением и не вижу смысла смотреть дальше. Я, конечно же, не вижу никаких преимуществ в использовании потоков.
По мере увеличения числа одновременных запросов вы должны оценивать общее прошедшее время, но я уверен, что вы достигнете точки убывающей доходности. Наличие большего количества одновременных запросов не гарантирует лучшую общую производительность.