将字节转换为包含Scala中每个单独位的布尔数组的最快方法是什么?

时间:2017-11-01 13:32:42

标签: algorithm scala optimization huffman-code

在Scala中实现霍夫曼算法并将结果写入文件后,我正在构建解码器。为此,我需要将我从文件中读取的List[Char]转换为包含每个单独位的List[Boolean]。因为它是一个大文件,我需要以最快的方式做到这一点。

我目前有以下算法:

def uncompress(fileString : String, fileChars : List[Char]) : String = {
 var bools:List[Boolean] = List[Boolean]()
    fileChars.foreach(f => bools = bools ++ byte2Bools(f))
}

 def byte2Bools(b: Char): Seq[Boolean] =
  0 to 7 map isBitSet(b)

def isBitSet(byte: Char)(bit: Int): Boolean =
  ((byte >> bit) & 1) == 1

但是,在600KB文件上完成此算法需要30多分钟!此外,我不确定是否可能在创建此算法时犯了一些错误。

如何才能提高性能?

1 个答案:

答案 0 :(得分:2)

fileChars.flatMap(byte2Bools)

会更快地将List[Char]转换为List[Boolean]

但是将List与原始类型一起使用已经意味着你有大量的内存开销,对于Boolean来说更是如此。我将String用于字符,Array[Boolean]BitSet用于比特(因为您事先知道长度)。当然,这会使代码更复杂......