3

Kryo真的又快又小。这里有什么秘密?

我已经深入研究了它的代码一段时间,但仍然需要一些指导。

谢谢。

4

1 回答 1

4

他们的页面

2.22 版本修复了许多报告的问题并提高了稳定性和性能。它还引入了许多新特性,最值得注意的是它可以使用 Unsafe 直接读写对象内存。这是进行序列化的绝对最快的方法,尤其是对于大型原始数组

sun.misc.Unsafe它使用对字段或ASM 库的直接字节码级访问。Kryo 甚至在引入不安全使用之前就已经很快了。我认为,一般的答案是性能是他们的最高优先级。仔细使用时,Java 的反射并没有那么慢 - 即当java.lang.Fieldandjava.lang.Method被缓存时。我设置了一个实验,它使用两个不同的比较器对数组进行排序——一个使用直接字段访问,另一个使用缓存字段。只有 2 倍的差异,这意味着在 IO 的上下文中不明显。

字段序列化器

默认情况下,大多数类最终会使用FieldSerializer. 它基本上完成了手写序列化的工作,但它是自动完成的。FieldSerializer直接分配给对象的字段。如果这些字段是公共的、受保护的或默认访问(包私有),则使用字节码生成来获得最大速度(请参阅 ReflectASM)。对于私有字段,使用 setAccessible 和缓存反射,速度还是挺快的。

于 2013-11-21T16:15:40.017 回答