哪个运行得更快:对每个要写入的字符串使用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());
答案 0 :(得分:4)
这完全取决于你写的是哪种OutputStream
。
如果它正在写入内存(ByteArrayOutputStream
),它将没有任何区别。
如果您正在写BufferedOutputStream
,则流将缓冲内存中的行并在缓冲区填满后将其写入基础流,因此它也不会产生任何差异。
如果您正在写FileOutputStream
或SocketOutputStream
,缓冲将带来更好的效果。但是,如果要写入的数据太大,将所有内容缓冲到内存中可能是一个坏主意:它可能需要太多内存。
最好的办法是使用缓冲的编写器或流,它将为您提供透明的缓冲,从而避免过多的低级写入,而不必明确地缓冲到StringBuilder
。
答案 1 :(得分:1)
取决于输出流编写器提供的内容,我会说。如果是ByteArrayOutputStream,那么我认为StringBuilder的开销会降低它的速度。但是,如果OutputStreamWriter提供了一个无缓冲的套接字流,那么我希望StringBuilder更快,但请记住,使用StringBuilder,你需要足够的内存来保存你想要在内存中发送的所有数据,所以我不希望扩展。
与往常一样,当谈到性能问题时:编写两个原型并对其进行测试,因为每个场景都会导致意外或令人惊讶的结果。
答案 2 :(得分:0)
既然我们在讨论android,我认为最好不要缓冲你的输出。使用stringbuilder可能会导致更大的内存使用量,并且调用StringBuilder.toString()会再次复制整个字符串并将其传递给您正在使用的流(并且可能再次缓冲)。因此,如果您处理大量数据,这将导致gc在您之后清理并且这也会降低性能。