对protostuff和java序列化的小测试

测试方法: 对一个含16个Integer/String/Date类型字段的扁平对象作序列化/反序列化,单机多线程循环执行,用循环一定次数之后sleep(1)控制频率,每隔1秒统计一次执行次数,并观察CPU/LOAD/内存等指标(因内存恒定开销,忽略掉)。

测试环境:4 x Xeon E5520 2.27GHz, 7.3GB 虚拟机

测试结果:

一、采用java内置序列化:

tps(w) thread cpu(%) load
8.9 1 22.3 0.8
15.5 2 46.3 1.64
21 3 69.7 2.88
23 4 88.5 3.5
20.5 5 70 4.2
19.5 6 71 5
20 7 67 6.28
20.5 8 64 6.5
20.5 40 70 7.5

JAVA内置反序列化:

tpc(w) thread cpu(%) load
2 1 24.6 1.1
3.85 2 49 1.9
5.8 3 72 2.8
7.65 4 96.6 4
7.6 5 96.8 4.5
7.6 6 96.9 6.3
7.6 7 97.1 7.2
7.6 8 98 9
7.6 40 97 14.5

二 protostuff序列化

tpc(w) thread cpu(%) load
54 1 9.8 1
105 2 22 0.8
150 3 41 1.8
190 4 52 2.44
180 5 66 3.6
200 6 76 5
240 7 85.7 5.1
250 8 94.3 5.3
270 40 99 17

protostuff反序列化

tpc(w) thread cpu(%) load
38 1 11 0.9
71 2 28.7 1.6
97 3 49 1.9
142 4 57.7 2.5
150 5 65 3.7
160 6 73 4.6
170 7 81 6.8
177 8 89 6.5
175 40 93 10.5

小结论:

1、线程数接近CPU核数能达到最好性能

2、java/protostuff序列化比反序列化性能都要好2倍左右

3、java序列化性能不理想,cpu跑满,也就10w左右,protostuff跟它完全不是一个量级,可以达到200w以上

相关推荐:

https://github.com/eishay/jvm-serializers/wiki (各种序列化对比测试,生成报表)

本文来源于"阿里中间件团队播客",原文发表时间" 2012-05-01"

时间: 2024-07-29 04:13:19

对protostuff和java序列化的小测试的相关文章

关于JAVA SESSION的小测试

手生就要多练啊...   package com.jeelearning.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.

浅析若干Java序列化工具

  在java中socket传输数据时,数据类型往往比较难选择.可能要考虑带宽.跨语言.版本的兼容等问题.比较常见的做法有: 采用java对象的序列化和反序列化 把对象包装成JSON字符串传输 Google工具protoBuf的开源 本文章所需要的序列化jar包都可以下载:http://download.csdn.net/detail/u013256816/9439971.   为了便于说明各个做法的区别,分别对这三种做法进行阐述. 对UserVo对象进行序列化,class UserVo如下:

java序列化的控制

正如大家看到的那样,默认的序列化机制并不难操纵.然而,假若有特殊要求又该怎么办呢?我们可能有特殊的安全问题,不希望对象的某一部分序列化:或者某一个子对象完全不必序列化,因为对象恢复以后,那一部分需要重新创建. 此时,通过实现Externalizable接口,用它代替Serializable接口,便可控制序列化的具体过程.这个Externalizable接口扩展了Serializable,并增添了两个方法:writeExternal()和readExternal().在序列化和重新装配的过程中,会

ejb与java序列化(3) 开启enable-call-by-reference

问题终于找到,简单的说是因为java 序列化的效率低下,而ejb调用之间又大量使用序列化,因此造成极大的性能消耗,而且也影响到响应时间.仔细分析了一下项目情况,呵呵,情况非常严重,系统架构是按照三层来设计的,每个层都是ejb,调下一层都是通过远程接口,而且层之间可能还多个ejb的调用. (说句题外话,这种设计个人感觉非常,恩,不理解,性能杀手,而且ejb配置极其复杂,当然或者ejb本来就是如此,ebj和weblogic对我来说是很陌生很高深的东西,目前还没有深入掌握.) 很自然的会想到ejb2.

Java序列化——transient关键字和Externalizable接口

    提到Java序列化,相信大家都不陌生.我们在序列化的时候,需要将被序列化的类实现Serializable接口,这样的类在序列化时,会默认将所有的字段都序列化.那么当我们在序列化Java对象时,如果不希望对象中某些字段被序列化(如密码字段),怎么实现呢?看一个例子: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import java.io.Serializable; import java.util

Java多线程知识小抄集(一)

本文主要整理博主遇到的Java多线程的相关知识点,适合速记,故命名为"小抄集".本文没有特别重点,每一项针对一个多线程知识做一个概要性总结,也有一些会带一点例子,习题方便理解和记忆. 1. interrupted与isInterrupted的区别 interrupted():测试当前线程是否已经是中断状态,执行后具有状态标志清除为false的功能. isInterrupted():测试线程Thread对象是否已经是中断状态,但不清除状态标志. 方法: public static boo

java序列化1[实现Serializable接口]

 * java默认序列化  * 1.实现Serializable接口(约定)  * 2.序列化和反序列化  * 3.实现java对象和字节序列的转换  * 4.将对象的字节序列(内存)持久化到磁盘(通常为文件),高并发session处理(减轻内存压力)  * 5.网络传输对象的字节序列,两个进程实现远程网络通信,(所有数据类型,都以二进制序列形式在网络上传送(接受发送))  * 6.实现Serializable接口的类采用默认的序列化方式 .* 7.静态变量(类变量)和transient修饰变量

【转载】JAVA序列化/反序列化与单例

本文转载自http://shift-alt-ctrl.iteye.com/blog/1842040   单例设计类:   Java代码   package com.test.singleton;      import java.io.IOException;   import java.io.ObjectStreamException;   import java.io.Serializable;         public class SingleTon implements Serial

java序列化2[实现Externalizable接口,可控序列化]

 * java可控制对象序列化:选择对象属性序列化,可序列化时加入当前类外其他属性  * 1.实现Externalizable接口(此接口实现了Serializable接口约定)  * 2.序列化和反序列化  * 3.控制序列化就是有选择的序列化对象(属性)  * 4.在序列化过程中储存(序列化),其他非this对象包含的数据或this信息  * 5.实现java对象和字节序列的转换  * 6.将对象的字节序列(内存)持久化到磁盘(通常为文件),高并发session处理(减轻内存压力)  * 7