Разница в скорости чтения ответа http и строки как InputStreams - PullRequest
0 голосов
/ 04 июля 2018

Я запрашиваю API через http, который возвращает огромный ответ. Этот ответ получен в виде InputStream. Оказывается, что итеративное чтение символов происходит довольно медленно, например, приблизительно 16,5 с для символов 750 000.

С другой стороны, если я создаю строку длиной 750 тыс. Символов и получаю поток из new ByteArrayInputStream(string.getBytes()), и итеративно вызываю read() до тех пор, пока он не вернет -1, это будет сделано примерно через 0,02 с.

Я сейчас звоню IOUtils.toString, но мои попытки сделать это вручную (с использованием BufferedReader из InputStreamReader) дают тот же результат.

String Builder output Buffer = new StringBuilder(750000);
for (int i = 0; i < 750000; i++) { 
   outputBuffer.append(i%100==0?"\n":"a");
}
String myString = outputBuffer.toString();
InputStream theStreamIBuilt = new ByteArrayInputStream(myString.getBytes());
long start = nanoTime();
String body = IOUtils.toString(theStreamIBuilt, encoding);
System.out.println("Time : "+((double)(nanoTime() - start)) /1000000000);
System.out.println("Number of chars :" +body.length ());

Это дает 0,02 с.

URLConnection con = (new URL(url)).openConnection();
InputStream theStreamIReceive = con.getInputStream();
long start = nanoTime();
String body = IOUtils.toString(theStreamIReceive, encoding);
System.out.println("Time : " + ((double) (nanoTime()-start) /1000000000);
System.out.println("Number of chars :" +body.length());

Это дает 16,74 с. Тот же размер был использован.

Здесь есть кое-что, чего я, по всей вероятности, упускаю из-за природы http-ответа InputStream. Что это? Откуда берется разница в скорости?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...