13

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

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

提前致谢。

4

2 回答 2

19

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

原因:

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

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

于 2013-10-18T15:11:29.117 回答
2

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

于 2013-10-18T13:35:48.767 回答