元字符串:在 Fury 序列化中比 UTF-8 节省 37.5%空间的字符串编码 | Apache Fory(孵化中)

主要观点:在 rpc/序列化系统中,常需在进程间传输长字符串,大多为 ASCII 字符串,常用 utf-8 编码但空间效率不高,多数字符可在较小范围表示却用 8 位编码,浪费显著位。为此提出新的元字符串编码算法(meta string encoding),将多数字符用 5 位编码代替 utf-8 的 8 位,可节省 37.5%空间,主要用于编码如字段名等元字符串,可缓存编码结果,编码性能不重要。介绍了三种字符串二进制编码算法(LOWER_SPECIAL、LOWER_UPPER_DIGIT_SPECIAL、UTF-8)及相关编码和解码代码片段,还说明了根据字符串内容选择最佳编码的策略,包括针对不同类型字符串的常用编码方式及 utf-8 为 fallback 编码,以及可联合编码标志和数据或用头信息编码标志等,最后通过基准测试对比 utf-8 编码和 fury 元字符串编码的空间效率。

关键信息

  • 新编码算法可节省 37.5%空间。
  • 三种编码算法及各自编码范围。
  • 不同类型字符串的最佳编码选择策略。
  • 联合编码标志和数据的方式。
  • 基准测试对比结果。

重要细节

  • LOWER_SPECIAL编码中各字符的编码范围及起始位标志。
  • LOWER_UPPER_DIGIT_SPECIAL编码中各字符的编码范围及起始位标志。
  • Java 和 Golang 中编码和解码的代码实现细节。
  • 不同类型字符串如包名、类名等的常用编码方式。
  • 基准测试中具体字符串的 utf-8 编码和 fury 元字符串编码的字节数对比。
阅读 16
0 条评论