压缩
本页介绍用于减小序列化数据体积的压缩选项。
整数压缩
可使用 ForyBuilder#withIntCompressed / ForyBuilder#withLongCompressed 对 int / long 进行压缩以减小体积。通常压缩 int 就足够了。
这两个压缩选项默认都已启用。如果序列化体积并不重要,例如你之前使用的是不会做压缩的 FlatBuffers,那么应考虑关闭压缩。如果你的数据几乎全是数字,压缩可能带来 80% 的性能回退。
Int 压缩
对于 int 压缩,Fory 使用 1 到 5 个字节进行编码。每个字节的第一位表示后面是否还有下一个字节。如果第一位被置位,就继续读取下一个字节,直到某个字节的第一位未置位为止。
Long 压缩
对于 long 压缩,Fory 支持两种编码方式:
SLI(Small Long as Int)编码,默认
- 如果 long 落在
[-1073741824, 1073741823]范围内,则按 4 字节 int 编码:| little-endian: ((int) value) << 1 | - 否则写成 9 字节:
| 0b1 | little-endian 8bytes long |
PVL(Progressive Variable-length Long)编码
- 每个字节的第一位表示后面是否还有下一个字节。如果第一位被置位,就继续读取下一个字节,直到某个字节的第一位未置位为止。
- 负数会通过
(v << 1) ^ (v >> 63)转换为正数,以降低小负数的编码成本。
如果一个数字虽然是 long 类型,但多数情况下并不能用更小字节数表示,那么压缩效果就不会理想,不值得承担对应的性能成本。如果你发现它没有带来明显的空间收益,可以考虑关闭 long 压缩。
数组压缩
当原始数组(int[] 和 long[])中的值可以放入更小的数据类型时,Fory 支持使用 SIMD 加速的数组压缩。该特性要求 Java 16+,并借助 Vector API 获得最佳性能。