目前,我正在使用DataOutput.writeLong(long)
. 这样做的问题很明显:在很多情况下多头会非常小。我想知道性能最高的 varint 实现是什么?我已经从协议缓冲区中看到了策略,并在随机长数据上进行了测试(这可能不是要测试的正确分布),我看到了相当大的性能下降(大约慢了 3-4 倍)。这是可以预料的吗?有没有什么好的策略可以在节省空间的同时尽快序列化多头?
谢谢你的帮助!
目前,我正在使用DataOutput.writeLong(long)
. 这样做的问题很明显:在很多情况下多头会非常小。我想知道性能最高的 varint 实现是什么?我已经从协议缓冲区中看到了策略,并在随机长数据上进行了测试(这可能不是要测试的正确分布),我看到了相当大的性能下降(大约慢了 3-4 倍)。这是可以预料的吗?有没有什么好的策略可以在节省空间的同时尽快序列化多头?
谢谢你的帮助!
协议缓冲区编码实际上非常好,但对随机多头没有帮助 - 如果您的多头可能是小的正数或负数(假设 95% 的时间在 +/- 1000 范围内),它最有用.
此范围内的数字通常会被编码为 1、2 或 3 个字节,而普通 long 为 8 个字节。尝试在大量 long 上使用这种输入,通常可以节省 50-70% 的空间。
当然,计算这种编码有一些性能开销,但如果你使用它进行序列化,那么 CPU 时间无论如何都不会成为你的瓶颈——所以你可以有效地忽略编码成本。
使用标准DataOutput
格式进行序列化和使用通用压缩算法(例如GZIPOutputStream
压缩)如何?