Я провел некоторое тестирование производительности с помощью библиотеки OkHttp и нашел, что это здорово. Он выполнил 80 запросов http://httpbin.org/delay/1, который намеренно приостанавливает 1 секунду для каждого запроса, в 4.7s на моем телефоне HTC One. Я просмотрел код, и я пытаюсь выяснить, почему он так быстро. Разработчики (Square Inc) рекламируют пулы соединений и асинхронные звонки, которые, как я считаю, способствуют хорошей производительности.
Я пришел из мира .NET, а в .NET 4.5 у вас есть истинная асинхронная HTTP-библиотека с методом Async GetResponse. Придавая поток ОС в ожидании ответа, вы освобождаете ресурсы, чтобы инициировать больше HTTP-запросов или других вещей. Дело в том, что я не могу видеть тот же шаблон с OkHttp (или любой другой библиотекой HTTP для Android, на которую я смотрел). Итак, как я могу выполнить 80 запросов на 1 секунду за 4 секунды? Это не основано на потоках, не так ли? Я не запускаю 80 (или 20) потоков?
Чтобы быть конкретным, в com.squareup.okhttp.Call.beginRequest(), я не вижу выхода нити между sendRequest
и getResponse
:
if (canceled) return null;
try {
engine.sendRequest();
if (request.body() != null) {
BufferedSink sink = engine.getBufferedRequestBody();
request.body().writeTo(sink);
}
engine.readResponse();
} catch (IOException e) {
HttpEngine retryEngine = engine.recover(e, null);
if (retryEngine != null) {
engine = retryEngine;
continue;
}
// Give up; recovery is not possible.
throw e;
}
Response response = engine.getResponse();
Итак, как сделать 80 "параллельных" звонков возможным?
Мне не нужно это знать, чтобы использовать библиотеку, но меня интересует асинхронное программирование, и мне очень хотелось бы понять, как это разрешило OkHttp/SquareInc.