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问题,好主意对任何语言都将有所帮助。
更新
经过研究后,我提议实现
1 2 3 4 | myEncode :: Text -> ByteString myEncode = unsafeCoerce myDecode :: ByteString -> Text myDecode = unsafeCoerce |
如果您喜欢segfault,这是个好主意...
此问题暗示了一系列广泛的问题。我将其解释为"在Haskell中,如何在Unicode和其他字符编码之间转换?"
在Haskell中,推荐的Unicode转换方法是
1 2 | fromUnicode :: Converter -> Text -> ByteString toUnicode :: Converter -> ByteString -> Text |
ICU还可以尝试自动检测输入的字符集。"充其量,这是使用统计和试探法的不精确操作。"没有其他实现可以"修复"该特征。在我撰写本文时,Haskell绑定没有公开该功能。参见#8。
我不知道任何用本机Haskell编写的字符集转换过程。正如ICU文档所指出的那样,存在很多复杂性。毕竟,这是国际计算历史的一个广阔领域。
表现
正如ICU常见问题解答所指出的那样:"大多数时候,硬盘驱动器和RAM的内存吞吐量是主要的性能限制。"尽管该评论不是专门针对转换的,但我希望它在这里也能广泛适用。是不是您的经历?