2014-01-21 49 views
4

我正在實現LZW算法。我已經成功實現了字符串和文本文件,並且正在修改我的代碼以使用二進制文件(例如圖像或可執行文件)(因爲我無法將這些文件作爲字符串讀取)。ArrayList <Byte> vs Java中的字符串

我用ArrayList<Byte>類型替換了我的代碼中的String類型。我的代碼現在正確地壓縮和解壓二進制文件,但它至少慢了10倍!在速度是關鍵要素的壓縮應用中,這是不可接受的。

我對String進行了ArrayList<Byte>的正確替換。有類似功能的更快的替代方案嗎?請注意,LZW算法需要數組大小調整,因此標準arrays[]不適用。

問候。

+0

你應該表現出你的代碼中,有可能是對性能的影響等顯而易見的原因。 –

回答

6

使用List<Byte>會將每個字節放入單獨的對象實例中。
散裝,這是你可以做的最糟糕的事情之一。

相比之下,數組或字符串可以佔用一塊固定的內存。

相反,你應該使用ByteArrayOutputStream,或直接使用byte[],並根據需要調整大小(你可以爲一個包裝類)

+2

+1「固態存儲器」可能是關鍵。像壓縮這樣的計算密集型操作可能會從增加的內存位置中受益很多。 – yshavit

1

你是一個ArrayListboxingbyte S,它使用更多的內存比簡單的String秒。這意味着每個byte被包裹在一個完整的對象中,並被引用引用。請注意,這樣的引用本身比原始字節大4到8倍!

使用原始byte []數組或者原始集合庫(正確提取原始數組作爲集合)(如thisthis)會更好。

0

ArrayList實現一個數組,因此它不適合大量的調整大小。 LinkedList應該提供更好的性能,如果調整大小是造成瓶頸。

https://stackoverflow.com/a/322742/1487030

+1

如果內存局部性是罪魁禍首(正如我懷疑的那樣),「LinkedList」的性能會更差。 – yshavit

+0

當我提到在問題中調整大小時。我的意思是相當於String = String + char;所以ArrayList .add(byte); –

相關問題