22

Data.Text谁能解释使用和Data.ByteString.Char8数据类型的优缺点?使用纯 ASCII 文本会改变这些优点和缺点吗?他们的懒惰变种也改变了故事吗?

4

1 回答 1

30

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

ByteString并且Text本质上是相同的,就表示而言——严格的、未装箱的数组,具有基于严格块列表的惰性变体。主要区别在于ByteString存储八位字节(即Word8s),而Text存储Chars,以 UTF-16 编码。

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

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

所以,基本上:

  1. Data.ByteString.Char8:对于性能至关重要的纯 ASCII 情况,以及处理具有一些 ASCII 组件的“几乎二进制”数据。
  2. Data.Text: 文本,包括任何可能使用 ASCII 以外的内容的情况。
于 2012-01-18T19:34:11.527 回答