[英]Writing with OutputStreamWriter: line by line vs all at once
哪個運行速度更快:對要寫入的每個字符串使用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());
這完全取決於您要寫入哪種OutputStream
。
如果它正在寫入內存( ByteArrayOutputStream
),則不會有任何區別。
如果您正在寫入BufferedOutputStream
,則該流將在內存中緩沖您的行,並在將其填滿到基礎流中之后將其寫入,因此也不會有任何區別。
如果要寫入FileOutputStream
或SocketOutputStream
,則緩沖將導致更好的性能。 但是,如果要寫入的數據太大,則將所有內容都緩存到內存中可能不是一個好主意:它可能需要太多內存。
最好的辦法是使用緩沖的編寫器或流,這將為您透明地進行緩沖,從而避免過多的低級寫入,而不必顯式地緩沖到StringBuilder
。
我會說,這取決於輸出流編寫器提供的內容。 如果它是ByteArrayOutputStream,那么我認為StringBuilder的開銷會使它變慢。 但是,如果OutputStreamWriter提供了無緩沖的套接字流,那么我希望StringBuilder會更快,盡管請記住,使用StringBuilder您將需要足夠的內存來保存要發送到內存中的全部數據,所以我也不會期望擴大規模。
與往常一樣,當涉及到性能問題時:編寫兩個原型並進行測試,因為每種情況都可能導致意外或令人驚訝的結果。
由於我們在談論android,所以我認為最好不要緩沖您的輸出。 使用stringbuilder可能會導致更大的內存使用量,並且通過調用StringBuilder.toString()再次將整個字符串復制並傳遞到您正在使用的流中(並可能再次進行緩沖)。 因此,如果您要處理大量數據,這將導致gc在您清除后清理,這也將降低性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.