使用OutputStreamWriter进行编写:一次一行地对所有进行编写

时间:2012-07-19 20:17:35

标签: java android performance stringbuilder outputstream

哪个运行得更快:对每个要写入的字符串使用OutputStreamWriter.write(),或者使用StringBuilder创建一个大字符串,然后使用write()一次?请解释原因。

这里多次使用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());

3 个答案:

答案 0 :(得分:4)

这完全取决于你写的是哪种OutputStream

如果它正在写入内存(ByteArrayOutputStream),它将没有任何区别。

如果您正在写BufferedOutputStream,则流将缓冲内存中的行并在缓冲区填满后将其写入基础流,因此它也不会产生任何差异。

如果您正在写FileOutputStreamSocketOutputStream,缓冲将带来更好的效果。但是,如果要写入的数据太大,将所有内容缓冲到内存中可能是一个坏主意:它可能需要太多内存。

最好的办法是使用缓冲的编写器或流,它将为您提供透明的缓冲,从而避免过多的低级写入,而不必明确地缓冲到StringBuilder

答案 1 :(得分:1)

取决于输出流编写器提供的内容,我会说。如果是ByteArrayOutputStream,那么我认为StringBuilder的开销会降低它的速度。但是,如果OutputStreamWriter提供了一个无缓冲的套接字流,那么我希望StringBuilder更快,但请记住,使用StringBuilder,你需要足够的内存来保存你想要在内存中发送的所有数据,所以我不希望扩展。

与往常一样,当谈到性能问题时:编写两个原型并对其进行测试,因为每个场景都会导致意外或令人惊讶的结果。

答案 2 :(得分:0)

既然我们在讨论android,我认为最好不要缓冲你的输出。使用stringbuilder可能会导致更大的内存使用量,并且调用StringBuilder.toString()会再次复制整个字符串并将其传递给您正在使用的流(并且可能再次缓冲)。因此,如果您处理大量数据,这将导致gc在您之后清理并且这也会降低性能。