Я запрашиваю 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. Что это? Откуда берется разница в скорости?