Kryo真的又快又小。这里有什么秘密?
我已经深入研究了它的代码一段时间,但仍然需要一些指导。
谢谢。
从他们的页面:
2.22 版本修复了许多报告的问题并提高了稳定性和性能。它还引入了许多新特性,最值得注意的是它可以使用 Unsafe 直接读写对象内存。这是进行序列化的绝对最快的方法,尤其是对于大型原始数组。
sun.misc.Unsafe
它使用对字段或ASM 库的直接字节码级访问。Kryo 甚至在引入不安全使用之前就已经很快了。我认为,一般的答案是性能是他们的最高优先级。仔细使用时,Java 的反射并没有那么慢 - 即当java.lang.Field
andjava.lang.Method
被缓存时。我设置了一个实验,它使用两个不同的比较器对数组进行排序——一个使用直接字段访问,另一个使用缓存字段。只有 2 倍的差异,这意味着在 IO 的上下文中不明显。
默认情况下,大多数类最终会使用
FieldSerializer
. 它基本上完成了手写序列化的工作,但它是自动完成的。FieldSerializer
直接分配给对象的字段。如果这些字段是公共的、受保护的或默认访问(包私有),则使用字节码生成来获得最大速度(请参阅 ReflectASM)。对于私有字段,使用 setAccessible 和缓存反射,速度还是挺快的。