Serializable和Externalizable(Java)之间的性能差异

时间:2010-08-22 08:03:36

标签: java serialization

我在高度分散的环境中工作。很多网络访问和大量的数据库访问。

我有一些通过网络发送的类,并且是序列化和反序列化的。

大多数课程的性质非常简单,例如:

class A{
    long a;
    long b;
}

有些更复杂(复合 - 收藏)。

我工作的公司中有些人声称所有类都应该实现Externalizable而不是Serializable,这会对应用程序的性能产生重大影响。

虽然对性能的影响很难衡量,但由于应用程序太大而且分布式且没有完全准备好,我现在无法真正模拟满负荷。

所以也许你们中的一些人知道一些有趣的文章会向我揭示任何内容。或许你可以分享一些想法。

我的基本直觉是,通过网络/ db对序列化和反序列化简单类(如上所述)没有任何区别,假设整个应用程序的IO进程大约为10%。 (我的意思是系统在90%的时间内做其他事情而不是IO)

6 个答案:

答案 0 :(得分:3)

  

我的基本直觉是,通过网络/ db对序列化和反序列化简单类(如上所述)没有任何区别,假设整个应用程序的IO进程大约为10%。 (我的意思是系统在90%的时间内做其他事情而不是IO)

你的直觉听起来很合理。但是10%的时间到底是什么?它只是序列化/反序列化吗?或者10%是否包含进行I / O的实际(时钟)时间?

修改

如果你有实际的性能分析测量来支持序列化+反序列化+ I / O的“10%到15%”时钟时间,那么逻辑会告诉你最大性能改进你可以获得将会少于那个。如果可以将I / O与序列化/反序列化分开,则可以优化该上限。我的猜测是实际的改善将低于5%。

我建议您使用序列化和外部化创建一个小型基准来发送和接收一个数据类型,并查看它实际产生的差异百分比。

必须说通用序列化与最佳实现的外部化相比,存在(相对)显着的开销。很多这是由于序列化的一般属性。

  • 编组/解组正在传输的对象中使用的每个类的类型描述符的开销。

  • 将每个编组对象添加到哈希表中会产生开销,因此序列化会忠实地记录周期等。

但是,序列化/反序列化只占总I / O开销的一小部分,而这些只是应用程序的一小部分。

答案 1 :(得分:3)

这是一个非常好的网站,比较了许多不同的Java序列化机制。

http://github.com/eishay/jvm-serializers/wiki

答案 2 :(得分:2)

我会要求他们提出一些测量来支持他们的说法。然后每个人都有理性讨论的基础。目前你还没有。请注意,那些声称应该提供支持证据的人:不要被证明有责任证明他们是错的。

答案 3 :(得分:0)

Java序列化是灵活和标准的,但它的设计并不快,特别是对于简单的对象。如果你想要速度,我建议你尝试粗麻布或protobuf。对于简单对象,这些速度可快5倍。或者你可以编写一个自定义序列化器,速度可以提高10倍。

答案 4 :(得分:0)

对我们来说,自定义序列化是最佳选择。我们让Java做它做得很好,或者至少足够好,免费,并为它的功能提供定制支持。这比完全的Externalizable支持要少得多。

我无法想象在什么情况下无法使用Externalizable进行自定义序列化(参考Roman对Peter的回答的评论)。具体来说,我指的是,例如,writeObject / readObject的实现。

答案 5 :(得分:0)

  1. 通用序列化可以很快 见http://java-is-the-new-c.blogspot.de/2013/10/still-using-externalizable-to-get.html

  2. 如果序列化性能显着,则取决于您的具体系统。我已经看到通过加速序列化获得了很多性能的系统。它不仅涉及CPU,还涉及延迟。例如。如果分布式系统执行大量阻塞请求/响应(请求者等待结果),则序列化会增加总体请求响应时间,这可能很重要,因为其(1)编码请求(2)解码请求(3)编码响应(4) )解码响应。因此,每个请求/响应有4个(去)序列化