簡體   English   中英

使用OutputStreamWriter編寫:一行一行vs一次全部

[英]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 ,則該流將在內存中緩沖您的行,並在將其填滿到基礎流中之后將其寫入,因此也不會有任何區別。

如果要寫入FileOutputStreamSocketOutputStream ,則緩沖將導致更好的性能。 但是,如果要寫入的數據太大,則將所有內容都緩存到內存中可能不是一個好主意:它可能需要太多內存。

最好的辦法是使用緩沖的編寫器或流,這將為您透明地進行緩沖,從而避免過多的低級寫入,而不必顯式地緩沖到StringBuilder

我會說,這取決於輸出流編寫器提供的內容。 如果它是ByteArrayOutputStream,那么我認為StringBuilder的開銷會使它變慢。 但是,如果OutputStreamWriter提供了無緩沖的套接字流,那么我希望StringBuilder會更快,盡管請記住,使用StringBuilder您將需要足夠的內存來保存要發送到內存中的全部數據,所以我也不會期望擴大規模。

與往常一樣,當涉及到性能問題時:編寫兩個原型並進行測試,因為每種情況都可能導致意外或令人驚訝的結果。

由於我們在談論android,所以我認為最好不要緩沖您的輸出。 使用stringbuilder可能會導致更大的內存使用量,並且通過調用StringBuilder.toString()再次將整個字符串復制並傳遞到您正在使用的流中(並可能再次進行緩沖)。 因此,如果您要處理大量數據,這將導致gc在您清除后清理,這也將降低性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM