主要观点:近期写了一个利用pext
指令的无分支 utf8 解码器,符合[rfc-3629],整个解码器约 29 条指令,代码可在[utf8-pext.c]找到。介绍了 utf8 编码规则,解码器接口,加载字节的两种方式(完全无分支和实用接口),确定序列长度的方法及注意事项,提取码点的过程(利用pext
指令),验证部分(包括码点范围、超长编码、代理对等),还给出了基准测试结果(不同处理器上各解码器的速度对比),最后得出此方法因硬件问题不具实用性的结论。
关键信息:
- 无分支解码器利用
pext
指令提取 utf8 码点,兼容[rfc-3629]。 - 介绍 utf8 编码的不同长度格式及重要位。
- 解码器接口及
err
字段的处理方式。 - 加载字节的两种方式及优缺点。
- 利用
pext
提取码点及相关掩码计算。 - 各种验证条件及处理方法。
- 不同解码器在不同处理器上的速度测试结果。
重要细节: gcc -O3 -march=x86-64-v3
编译下整个解码器约 29 条指令。- 无分支加载字节时需保证缓冲区有 4 字节空字符填充。
- 确定长度时利用长度表,注意有效和无效情况。
- 验证部分的各种条件及掩码设置。
- 不同解码器在 intel 14900KS 和 3700x 上的速度差异及原因(
pext
在旧 ryzen 上由微码模拟,性能差)。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。