为什么Java的序列化比第三方API慢?

2022-09-04 19:20:45

在处理套接字并在它们上序列化对象的过程中,我注意到有一些第三方库可以在Java上更快地进行对象序列化,例如KryoFST。到目前为止,我期望Java的序列化是优化和最快的。因为,它依赖于语言,并给出了一个预计会更快的低级解决方案。但是,经过考虑的库声称它们比Java更快。

有人可以解释为什么Java不能提供最快的序列化解决方案吗?为了什么放弃了更好的表现?

提前致谢。


答案 1

有几个原因(我是 http://code.google.com/p/fast-serialization/)

原因:

  • 对每个对象的类层次结构进行爬网,对每个对象执行多次读/写调用,以防万一。
  • 部分编码较差(改进为 1.7)
  • 一些常用的类利用旧的慢速+过时的序列化功能,如putfield/getfield等。
  • 临时对象分配过多
  • 大量的验证(版本控制,实现的接口)
  • 慢速 Java 输入/输出流
  • 反射以设置/获取字段值。
  • 使用需要“大数字”(如整数或 Long)而不是基元的 JDK 集合。
  • 实现缺乏某些算法优化:-)
  • 在 x86 上,基元被重新排序为网络字节顺序(在 java 代码中,而不是本机)。

为了提供更好的性能,他们将不得不放弃对旧版本控制方案的支持(例如,读/写Object当前的工作方式不是最佳的),并使一些东西(如版本控制支持)可选或选择对性能更敏感的方法(可能是可能的)。此外,HotSpot 可能会添加一些内部函数来改善基元的低级处理。在设计API时,需要考虑性能,而JDK序列化可能不是这种情况。


答案 2

Java 序列化速度很慢,因为它使用反射。JDK 序列化会执行大量向后兼容性检查和严格的类型检查。但是java序列化在大多数情况下在反序列化后100%相同的对象。