Data.Text与Data.ByteString.Char8

Tho*_*ing 20 text haskell bytestring

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

ehi*_*ird 28

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

ByteString并且Text基本上表示相同 - 严格的,未装箱的数组,其中包含基于严格块列表的惰性变体.主要区别在于ByteString存储八位字节(即Word8s),而Text存储Chars,以UTF-16编码.

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

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

所以,基本上:

  1. Data.ByteString.Char8:对于性能至关重要的纯ASCII情况,以及处理具有某些ASCII组件的"几乎二进制"数据.
  2. Data.Text:文本,包括除了使用ASCII之外最轻微的可能性的任何情况.

  • @trinithis:好吧,如果你的数据都是 ASCII,那么 `Text` 会将每个字符编码为两个字节,但 `ByteString` 会将它们编码为一个字节。不过,如果您当前正在使用“String”,我不会太担心;`String` 的开销非常大(每个字符 5 个单词(!)),远远超过其他两个。请参阅[内存足迹摘要](http://blog.johantibell.com/2011/06/memory-footprints-of-some-common-data.html)。 (2认同)
  • @trithithis:当然,你应该记住`String`可以从共享中受益,而`ByteString`和`Text`,作为未装箱的数组,不会; 然而,`ByteString`和`Text`都是在不复制的情况下进行子串的,并且它们开始时要小得多,你必须非常努力地做出这个缺点. (2认同)