Java 从字节[]转换为字符串的惊人计时

Java 从字节[]转换为字符串的惊人计时,java,performance,scala,Java,Performance,Scala,我使用DataInputStream从文件中读取字节数组并转换为字符串。这是原始代码。注意,dis是FileInputStream上的BufferedInputStream上的DataInputStream // class definition var byteBuffer = Array[Byte](0) ... // Get the payload if (contentLength > byteBuffer.length) { println("resize") byt

我使用
DataInputStream
从文件中读取字节数组并转换为字符串。这是原始代码。注意,dis是
FileInputStream
上的
BufferedInputStream
上的
DataInputStream

// class definition
var byteBuffer = Array[Byte](0)

...

// Get the payload
if (contentLength > byteBuffer.length) {
  println("resize")
  byteBuffer = new Array[Byte](contentLength, "UTF-8")
}
dis.read(byteBuffer, 0, contentLength)

new String(byteBuffer)
这段代码和周围的处理速度很慢。我每秒只处理80个文档。一个小的变化会显著提高速度

// Get the payload
val byteBuffer = new Array[Byte](contentLength, "UTF-8")
dis.read(byteBuffer, 0, contentLength)

new String(byteBuffer)
现在我每秒处理近300个文档。为什么每次分配数组都会带来巨大的速度优势,即使在深入研究了一点解码代码之后,这对我来说毫无意义。有什么想法吗


val/var变化是不相关的。如果我只删除条件,它将获得相同的速度提升。

在第二种情况下,您将生成一个大小正确的字符串。在第一种情况下,您的字符串都与之前创建的最大字符串一样大


您可能有更晚的处理代码,使您没有注意到这一差异?

Ahh。。。太蠢了。。。我没有注意到,因为字符串是大型HTML文档。我可能也会调用trim。我也被抛弃了,因为当我使用
scalax.io
时,我的计时结果是类似的,尽管(我认为)出于非常不同的原因。很难知道如何使用
scalax.io
的有效部分,而且很容易使用无效部分。代码中有两个错误:(1)忽略
read()
的返回值,(2)在转换为字符串时不指定编码。谢谢,我在实际代码中指定了编码。我把它加在这里。