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

时间:2013-10-18 10:40:18

标签: java performance serialization

在处理套接字并在其上序列化对象时,我注意到有一些第三方库可以更快地在Java上进行对象序列化,例如KryoFST。到目前为止,我期望Java的序列化得到优化并且速度最快。因为,它依赖于语言,并提供预期更快的低级解决方案。但是,考虑过的库声称它们比Java更快。

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

提前致谢。

2 个答案:

答案 0 :(得分:18)

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

原因:

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

为了提供更好的性能,他们必须放弃对旧版本控制方案的支持(例如,read / writeObject当前工作的方式不是最理想的),并使版本支持等一些内容可选,或选择更多性能敏感的方法那(可能)。此外,HotSpot可能会添加一些内在函数来改进基元的低级处理。在设计API时需要考虑性能,JDK序列化可能不是这样。

答案 1 :(得分:2)

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