关于Haskell:快速,优化的UTF8编码解码

Fast, optimized UTF8 encode decode

您知道一些额外的信息来对UTF8进行编码和解码的最快方法吗?这是发生在我身上的有趣情况:

序列化

我只想编码一个不带验证的不透明缓冲区,以便稍后再解码。最快的方法是使用底层的内存缓冲区,并以某种方式不安全地将其从Text强制转换为ByteString而不触及内容。

可能是ASCII

我猜我的UTF8有99%的时间实际上是ASCII,因此有必要进行第一遍以确认这一点,并且只有在发现不正确的情况下才进行进一步处理。

可能不是ASCII

与上一个相反。

可能很短

我估计JSON或数据库中的单个键为1到20个字符。像矢量化SIMD方法那样愚蠢地支付一些前期费用。

大概长

一个HTML文档。为获得最高的吞吐量而付出一些前期成本是值得的。

还有更多类似的变体,例如对JSON或URL进行编码,并且您认为可能没有转义符。

我想在[Haskell]标签下问这个问题,因为Haskell的强类型化使得某些在C语言中难以实现的技术很难实现。另外,可能会有一些特殊的GHC技巧,例如在Intel平台上使用SSE4指令会很有趣。但这通常只是一个UTF8问题,好主意对任何语言都将有所帮助。

更新

经过研究后,我提议实现encodedecode以便进行序列化,如下所示:

1
2
3
4
myEncode :: Text -> ByteString
myEncode = unsafeCoerce
myDecode :: ByteString -> Text
myDecode = unsafeCoerce

如果您喜欢segfault,这是个好主意...


此问题暗示了一系列广泛的问题。我将其解释为"在Haskell中,如何在Unicode和其他字符编码之间转换?"

在Haskell中,推荐的Unicode转换方法是text-icu中的函数,该函数提供了一些基本功能:

1
2
fromUnicode :: Converter -> Text -> ByteString
toUnicode :: Converter -> ByteString -> Text

text-icu是Unicode库国际组件的绑定,该库除了对非Unicode字符集进行编码和解码外,还需要进行大量工作。它的网站提供了有关转换的一般文档以及有关其转换器实现方式运行方式的一些特定信息。请注意,不同的字符集需要稍微不同的掩体实现。

ICU还可以尝试自动检测输入的字符集。"充其量,这是使用统计和试探法的不精确操作。"没有其他实现可以"修复"该特征。在我撰写本文时,Haskell绑定没有公开该功能。参见#8。

我不知道任何用本机Haskell编写的字符集转换过程。正如ICU文档所指出的那样,存在很多复杂性。毕竟,这是国际计算历史的一个广阔领域。

表现

正如ICU常见问题解答所指出的那样:"大多数时候,硬盘驱动器和RAM的内存吞吐量是主要的性能限制。"尽管该评论不是专门针对转换的,但我希望它在这里也能广泛适用。是不是您的经历?

unsafeCoerce在这里不合适。