3

哪个运行得更快:对每个要写入的字符串使用 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());
4

3 回答 3

4

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

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

如果您正在写入 a BufferedOutputStream,则流将在内存中缓冲您的行,并在缓冲区满后将其写入底层流,因此也不会产生任何影响。

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

最好的办法是使用缓冲的写入器或流,它会透明地为您处理缓冲,从而避免过多的低级写入,而不必显式缓冲到StringBuilder.

于 2012-07-19T20:26:02.810 回答
1

我会说,取决于输出流编写器提供的内容。如果它是 ByteArrayOutputStream,那么我认为 StringBuilder 的开销会减慢它的速度。但是,如果 OutputStreamWriter 提供无缓冲的套接字流,那么我希望 StringBuilder 更快,但请记住,使用 StringBuilder 您将需要足够的内存来保存要在内存中发送的全部数据,所以我不希望扩大规模。

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

于 2012-07-19T20:24:34.057 回答
0

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

于 2012-07-19T20:59:35.823 回答