有人能解释使用Data.Text
和Data.ByteString.Char8
数据类型的利弊吗?仅使用ASCII文本是否会改变这些利弊?他们懒惰的变种也改变了故事吗?
Data.ByteString.Char8
提供了将ByteString
值视为8位ASCII字符序列的函数,而Data.Text
是支持整个Unicode的独立类型。
就表示而言,ByteString
和Text
本质上是相同的——严格的、未装箱的数组,具有基于严格块列表的惰性变体。主要区别在于ByteString
存储八位字节(即Word8
s),而Text
存储以UTF-16编码的Char
s。
如果您只使用ASCII文本,那么使用Data.ByteString.Char8
可能比使用Text
更快,并且使用更少的内存;然而,您应该问问自己,您是否真的确信您只会使用ASCII。基本上,在99%的情况下,使用Data.ByteString.Char8
而不是Text
是一种速度破解——八位字节不是字符,任何Haskeller都可以同意,使用正确的类型应该优先于原始的裸机速度。通常,只有当你已经对程序进行了分析,并且它是一个瓶颈时,你才应该考虑它。Text
得到了很好的优化,在大多数情况下,差异可能可以忽略不计。
当然,在一些与速度无关的情况下,Data.ByteString.Char8
是有保障的。考虑一个文件,其中包含的数据本质上是二进制的,不是文本,而是分隔成行的;使用CCD_ 18是完全合理的。此外,在二进制格式的上下文中,整数可以用ASCII十进制编码,这是完全可以想象的;在这种情况下使用CCD_ 19将是完全合理的。
所以,基本上:
Data.ByteString.Char8
:用于性能至关重要的纯ASCII情况,以及处理包含一些ASCII组件的"几乎二进制"数据Data.Text
:文本,包括任何情况,其中使用ASCII以外的东西的可能性最小