读取http响应和作为InputStreams的字符串之间的速度差异

时间:2018-07-04 11:04:26

标签: java performance http

我正在通过http查询一个api,该API返回了巨大的响应。该响应以InputStream的形式获得。事实证明,仅迭代读取字符是相当慢的,例如,对于750k字符,大约需要16.5s。

另一方面,如果我创建了一个750k个字符长的字符串,并从new ByteArrayInputStream(string.getBytes())获取流,然后迭代调用read()直到返回-1,则它将在大约0时执行, 02秒。

我当前正在呼叫IOUtils.toString,但是我尝试手动进行操作(使用BufferedReader的{​​{1}})会产生相同的结果。

InputStreamReader

这将产生0,02s。

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 ());

这产生了16,74s。使用相同的尺寸。

关于InputStream http响应的性质,我最有可能在这里基本缺少一些东西。它是什么?速度差来自哪里?

0 个答案:

没有答案