任何人都可以解释使用Data.Text
和Data.ByteString.Char8
数据类型的优缺点吗?使用纯ASCII文本是否会改变这些优点和缺点?他们的懒惰变体也改变了故事吗?
答案 0 :(得分:28)
Data.ByteString.Char8
提供了将ByteString
值视为8位ASCII字符序列的函数,而Data.Text
是支持整个Unicode的独立类型。
ByteString
和Text
基本上是相同的,就表示而言 - 严格的,未装箱的数组,其中包含基于严格块列表的惰性变体。主要区别在于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
会非常有意义。
所以,基本上:
Data.ByteString.Char8
:对于性能至关重要的纯ASCII情况,以及处理具有某些ASCII组件的“几乎二进制”数据。Data.Text
:文字,包括任何情况,其中除了使用ASCII以外的其他东西的可能性最小。