Data.Text vs Data.ByteString.Char8



有人能解释使用Data.TextData.ByteString.Char8数据类型的利弊吗?仅使用ASCII文本是否会改变这些利弊?他们懒惰的变种也改变了故事吗?

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

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

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

当然,在一些与速度无关的情况下,Data.ByteString.Char8是有保障的。考虑一个文件,其中包含的数据本质上是二进制的,不是文本,而是分隔成行的;使用CCD_ 18是完全合理的。此外,在二进制格式的上下文中,整数可以用ASCII十进制编码,这是完全可以想象的;在这种情况下使用CCD_ 19将是完全合理的。

所以,基本上:

  1. Data.ByteString.Char8:用于性能至关重要的纯ASCII情况,以及处理包含一些ASCII组件的"几乎二进制"数据
  2. Data.Text:文本,包括任何情况,其中使用ASCII以外的东西的可能性最小

最新更新