2012-07-19 17 views
2

哪個運行速度更快:使用OutputStreamWriter.write()來寫入每個字符串,或者使用StringBuilder創建一個大字符串,然後使用write()一次?請解釋原因。使用OutputStreamWriter寫入:逐行對齊全部

下面是使用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

這一切都取決於你寫的是哪種OutputStream

如果正在寫入內存(ByteArrayOutputStream),則不會有任何區別。

如果你正在寫信給BufferedOutputStream,那麼這個流將緩衝你在內存中的行,並在緩衝區滿了基本流後寫入緩衝區,所以它也不會有任何區別。

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

要做的最好的事情是使用一個緩衝的作家或流,它將爲你緩衝透明,從而避免太多的低級寫入,而不必明確緩衝到StringBuilder

+1

在做了一些更多的研究之後,它看起來像我的OutputStreamWriter使用緩衝區將字符流轉換爲字節流。因此,這兩種方法之間可能差別很小。對於任何對速度感興趣的人,Java文檔都提到:「爲了獲得最高效率,請考慮在BufferedWriter內封裝OutputStreamWriter,以避免頻繁的轉換器調用。例如: Writer out = new BufferedWriter(new OutputStreamWriter(System.out));「 – 2012-07-20 02:27:08

1

要看什麼輸出流作家飼料,我會說。如果它是一個ByteArrayOutputStream,那麼我會認爲StringBuilder的開銷會降低它的速度。但是,如果OutputStreamWriter提供一個無緩衝的套接字流,那麼我認爲StringBuilder會更快,不過請記住,使用StringBuilder,您需要足夠的內存來存放要發送到內存中的所有數據,所以我不期望能夠擴展。

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

0

既然我們在談論android,我認爲最好不要緩衝你的輸出。使用stringbuilder可能會導致更大的內存使用量,並調用StringBuilder.toString()時,整個字符串會被複制並傳遞到您正在使用的流(可能會再次緩衝)。所以如果你處理大量的數據,這會導致gc在你之後得到清理,並且這也會降低性能。