3

書き込む文字列ごとに OutputStreamWriter.write() を使用するのと、StringBuilder を使用して 1 つの大きな文字列を作成してから、write() を 1 回使用するのとでは、どちらが高速ですか? 理由を説明してください。

ここでは write() を何度も使用しています。

writer.write("Registered Players:\n");
while (it.hasNext()) {
    int playerID = (Integer) it.next();
    Player player = playerRegistry.get(playerID);

    writer.write(playerID+": "+player.getPlayerName()+"\n");
}

そして、これが StringBuilder の場合です。

builder.append("Registered Players:\n");
while (it.hasNext()) {
    int playerID = (Integer) it.next();
    Player player = playerRegistry.get(playerID);

    builder.append(playerID+": "+player.getPlayerName()+"\n");
}
writer.write(builder.toString());
4

3 に答える 3

4

OutputStreamそれはすべて、あなたが書いている種類によって異なります。

メモリへの書き込み(ByteArrayOutputStream)の場合、違いはありません。

に書き込んでいる場合BufferedOutputStream、ストリームはメモリ内の行をバッファリングし、バッファがいっぱいになると基礎となるストリームに書き込むので、どちらも違いはありません。

FileOutputStreamまたは に書き込んでいる場合SocketOutputStream、バッファリングによりパフォーマンスが向上します。しかし、書き込むデータが大きすぎる場合、すべてをメモリにバッファリングするのは良くない考えです。大量のメモリが必要になる可能性があります。

最善の方法は、バッファリングされたライターまたはストリームを使用することです。これは、バッファリングを透過的に処理し、StringBuilder.

于 2012-07-19T20:26:02.810 に答える
1

出力ストリームライターが何をフィードするかによって異なります。ByteArrayOutputStream の場合、StringBuilder のオーバーヘッドにより速度が低下すると思います。ただし、OutputStreamWriter がバッファリングされていないソケット ストリームをフィードする場合は、StringBuilder の方が高速であると予想されますが、StringBuilder を使用すると、メモリに送信するデータ全体を保持するのに十分なメモリが必要になることに注意してください。したがって、同様にスケーリングすることは期待できません。

いつものように、パフォーマンスの問題に関しては、2 つのプロトタイプを作成してテストしてください。それぞれのシナリオが予期せぬ結果または驚くべき結果をもたらす可能性があるためです。

于 2012-07-19T20:24:34.057 に答える
0

私たちはアンドロイドについて話しているので、私はあなたの出力をバッファリングしないのが最善だと思います。stringbuilderを使用すると、メモリ使用量が増える可能性があり、StringBuilder.toString()を呼び出すと、文字列全体が再度コピーされ、使用しているストリームに渡されます(場合によっては再度バッファリングされます)。したがって、大量のデータを処理している場合、これによりgcがクリーンアップされ、パフォーマンスも低下します。

于 2012-07-19T20:59:35.823 に答える