Data.Text与Data.ByteString.Char8

时间:2012-01-18 19:28:22

标签: haskell text bytestring

任何人都可以解释使用Data.TextData.ByteString.Char8数据类型的优缺点吗?使用纯ASCII文本是否会改变这些优点和缺点?他们的懒惰变体也改变了故事吗?

1 个答案:

答案 0 :(得分:28)

Data.ByteString.Char8提供了将ByteString值视为8位ASCII字符序列的函数,而Data.Text是支持整个Unicode的独立类型。

ByteStringText基本上是相同的,就表示而言 - 严格的,未装箱的数组,其中包含基于严格块列表的惰性变体。主要区别在于ByteString存储八位字节(即Word8 s),而Text存储Char s,以UTF-16编码。

如果您使用的是纯ASCII文本,那么使用Data.ByteString.Char8可能会比Text更快,并且使用更少的内存;但是,你应该问问自己,你是否确实确定你只会使用ASCII。基本上,在99%的情况下,使用Data.ByteString.Char8而不是Text是速度破解 - 八位字节不是字符,任何Haskeller都同意使用正确类型应优先于原始裸机速度。如果你已经分析了程序并且它是一个瓶颈,你通常应该只考虑它。 Text已得到很好的优化,在大多数情况下差异可能会微不足道。

当然,有一些非速度相关的情况需要Data.ByteString.Char8。考虑一个包含数据的文件,这些数据本质上是二进制的,而不是文本,但是分成行使用lines是完全合理的。另外,完全可以想象整数可以在二进制格式的上下文中以ASCII十进制编码;在这种情况下使用readInt会非常有意义。

所以,基本上:

  1. Data.ByteString.Char8:对于性能至关重要的纯ASCII情况,以及处理具有某些ASCII组件的“几乎二进制”数据。
  2. Data.Text:文字,包括任何情况,其中除了使用ASCII以外的其他东西的可能性最小。