我正在通过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响应的性质,我最有可能在这里基本缺少一些东西。它是什么?速度差来自哪里?