4

我正在实现 LZW 算法。我已经成功地为字符串和文本文件实现了它,并且目前正在修改我的代码以使用二进制文件,例如图像或可执行文件(因为我无法将这些文件作为字符串读取)。

我已将String代码中的类型替换为ArrayList<Byte>类型。我的代码现在可以正确地压缩和解压缩二进制文件,但是它至少慢了 10 倍!这在速度是关键因素的压缩应用中是不可接受的。

我是否正确替换了ArrayList<Byte>for String。是否有具有类似功能的更快替代方案?请注意,LZW 算法需要调整数组大小,因此标准arrays[]不适合。

问候。

4

4 回答 4

6

使用List<Byte>将每个字节装箱到一个单独的对象实例中。
总的来说,这是您可以为性能做的最糟糕的事情之一。

相比之下,一个数组或字符串可以占用一个实心内存块。

相反,您应该使用ByteArrayOutputStream,或byte[]直接使用并根据需要调整大小(您可以为此创建一个包装类)

于 2014-01-21T00:24:14.827 回答
1

您在 an 中装箱 bytes ArrayList,它比 simple s 使用更多的内存String。这意味着每个byte都包装在一个完整的对象中,并由引用引用。请注意,这样的引用本身比原始字节大 4 到 8 倍!

最好使用原始byte []数组,或者使用原始集合库(将原始数组正确抽象为集合),例如thisthis

于 2014-01-21T00:25:17.647 回答
0

您需要找到导致速度变慢的代码部分。问题中没有足够的信息来获得任何有用的答案。

您应该使用分析器。请参阅此线程:您使用哪种 Java 分析工具以及您认为哪种工具最好?

于 2014-01-21T00:25:49.753 回答
0

ArrayList实现了一个数组,因此它不适合大量调整大小。LinkedList如果调整大小造成瓶颈,应该提供更好的性能。

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

于 2014-01-21T00:26:42.787 回答