无分支 UTF-8 编码

主要观点:讨论在 Rust 中实现从 Unicode 码点到 UTF-8 编码且无分支的方法。
关键信息:

  • 最初的 C 函数num_utf8_bytes_for_codepoint通过分支判断码点所需字节数。
  • 后来提出一种几乎无分支的方法,通过计算码点的前导零来确定字节数等参数,但仍有一些分支。
  • 最终通过调整长度计算函数,消除所有分支,使代码完全无分支,且编译器可消除数组边界检查。
  • 指出此代码虽无分支但未优化,未基准测试,也不保证有用,代码已 MIT 许可发布。
  • 介绍了关于bsrlzcnt的相关讨论及替代方法,还分享了 Christopher Wellons 的分支无编码器及相关基准测试结果,以及在 Rust 实现中可省略一些检查的情况。

重要细节:

  • 代码中使用各种常量数组如LENPREFIX等进行 UTF-8 编码相关计算。
  • 编译器在不同优化级别下对代码的处理及分支消除情况不同。
  • 提到不同架构下指令的差异及适用性等问题。
阅读 7
0 条评论