2

DataInputStreamファイルからバイト配列を読み取り、文字列に変換するために a を使用しています。これが元のコードです。dis はDataInputStreamon a BufferedInputStreamon a GZipInputStreamon a であることに注意してくださいFileInputStream

// 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 の変更は関係ありません。条件を削除するだけで、同じ速度が向上します。

4

1 に答える 1

9

2 番目のケースでは、適切なサイズの文字列を作成します。最初のケースでは、文字列はすべて、以前に作成した最大の文字列と同じ大きさです。

おそらく、後でこの違いに気付かないコードを処理しているのではないでしょうか?

于 2013-03-11T17:38:51.663 に答える