我正在实施LZW算法。我已经成功地为字符串和文本文件实现了它,并且我正在修改我的代码以使用二进制文件,例如图像或可执行文件(因为我无法将这些文件作为字符串读取)。
我已使用String
类型替换了代码中的ArrayList<Byte>
类型。我的代码现在正确压缩和解压缩二进制文件,但它至少慢了10倍!在速度是关键因素的压缩应用中,这是不可接受的。
我是否ArrayList<Byte>
正确替换String
。有类似功能的更快的替代方案吗?请注意,LZW算法需要调整数组大小,因此标准arrays[]
不合适。
问候。
答案 0 :(得分:6)
使用List<Byte>
会将每个字节放入一个单独的对象实例中
总的来说,这是你可以为表现做的最糟糕的事情之一。
相比之下,数组或字符串可以占用一块可靠的内存。
相反,您应该使用ByteArrayOutputStream
,或直接使用byte[]
并根据需要调整大小(您可以为此创建包装类)
答案 1 :(得分:1)
byte
ArrayList
内的boxing String
,其使用的内存比简单byte
多得多。这意味着每个byte []
都包含在一个整个对象中,并由引用引用。请注意,这样的引用本身比原始字节大4到8倍!
答案 2 :(得分:0)
您需要找到导致速度减慢的代码部分。问题中没有足够的信息来获得任何有用的答案。
您应该使用分析器。请参阅此主题:Which Java Profiling tool do you use and which tool you think is the best?
答案 3 :(得分:0)
ArrayList
实现了一个数组,因此不适合进行大量调整。如果调整大小会造成瓶颈,LinkedList
应该会提供更好的性能。