有没有人能解释一下使用
Data.Text
和 Data.ByteString.Char8
数据类型的利弊?仅使用ASCII文本是否会改变这些利弊?它们的lazy变体是否也会改变情况?Data.Text
和 Data.ByteString.Char8
数据类型的利弊?仅使用ASCII文本是否会改变这些利弊?它们的lazy变体是否也会改变情况?Data.ByteString.Char8
提供了将ByteString
值视为8位ASCII字符序列的函数,而Data.Text
是一种独立的类型,支持Unicode的全部内容。
ByteString
和Text
在表示方面本质上是相同的——严格、非装箱数组,基于严格块列表的惰性变体。主要区别在于ByteString
存储八位字节(即Word8
),而Text
则存储使用UTF-16编码的Char
。
如果你正在处理仅包含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 以外字符的情况。
Data.ByteString.Char8
,因为你实际上将处理一种类似文本的二进制格式。(我还建议查看 attoparsec 以解析文件。) - ehirdString
受益于共享,而ByteString
和Text
作为非装箱数组则没有;然而,ByteString
和Text
都可以在不复制的情况下接受子字符串,它们本来就比String
小得多,所以你需要很努力才能使这个缺点变得重要。 - ehird