简介

最近几年,各种新的高效序列化方式层出不穷,不断刷新序列化性能的上限,最典型的包括:

专门针对Java语言的:Kryo,FST等等

跨语言的:Protostuff,ProtoBuf,Thrift,Avro,MsgPack等等

这些序列化方式的性能多数都显著优于hessian2(甚至包括尚未成熟的dubbo序列化)。有鉴于此,我们为dubbo引入Kryo和FST这 两种高效Java序列化实现,来逐步取代hessian2。其中,Kryo是一种非常成熟的序列化实现,已经在Twitter、Groupon、 Yahoo以及多个著名开源项目(如Hive、Storm)中广泛的使用。而FST是一种较新的序列化实现,目前还缺乏足够多的成熟使用案例,但它还是非 常有前途的,下面我们比较下,java原生序列化Kryo序列化性能比较

1、实体类 Simple.java

packagebhz.entity;importjava.io.Serializable;importjava.util.Map;public class Simple implementsSerializable

{private static final long serialVersionUID = -4914434736682797743L;privateString name;private intage;private Mapmap;publicSimple(){

}public Simple(String name,int age,Mapmap){this.name =name;this.age =age;this.map =map;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}public intgetAge() {returnage;

}public void setAge(intage) {this.age =age;

}public MapgetMap() {returnmap;

}public void setMap(Mapmap) {this.map =map;

}

}

2、java原生序列化 OriginalSerializable.java

packagebhz.test;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.util.HashMap;importjava.util.Map;importbhz.entity.Simple;public classOriginalSerializable {public static void main(String[] args) throwsIOException, ClassNotFoundException {long start =System.currentTimeMillis();

setSerializableObject();

System.out.println("java原生序列化时间:" + (System.currentTimeMillis() - start) + " ms" );start=System.currentTimeMillis();

getSerializableObject();

System.out.println("java原生反序列化时间:" + (System.currentTimeMillis() - start) + " ms");}public static void setSerializableObject() throwsIOException{

FileOutputStream fo= new FileOutputStream("D:/file2.bin");

ObjectOutputStream so= newObjectOutputStream(fo);for (int i = 0; i < 100000; i++) {

Map map = new HashMap(2);

map.put("zhang0", i);

map.put("zhang1", i);

so.writeObject(new Simple("zhang"+i,(i+1),map));

}

so.flush();

so.close();

}public static voidgetSerializableObject(){

FileInputStream fi;try{

fi= new FileInputStream("D:/file2.bin");

ObjectInputStream si= newObjectInputStream(fi);

Simple simple=null;while((simple=(Simple)si.readObject()) != null){//System.out.println(simple.getAge() + " " + simple.getName());

}

fi.close();

si.close();

}catch(FileNotFoundException e) {

e.printStackTrace();

}catch(IOException e) {//e.printStackTrace();

} catch(ClassNotFoundException e) {

e.printStackTrace();

}

}

}

3、kyro序列化 KyroSerializable.java

packagebhz.test;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.util.HashMap;importjava.util.Map;importorg.objenesis.strategy.StdInstantiatorStrategy;importbhz.entity.Simple;importcom.esotericsoftware.kryo.Kryo;importcom.esotericsoftware.kryo.KryoException;importcom.esotericsoftware.kryo.io.Input;importcom.esotericsoftware.kryo.io.Output;public classKyroSerializable {public static void main(String[] args) throwsIOException {long start =System.currentTimeMillis();

setSerializableObject();

System.out.println("Kryo 序列化时间:" + (System.currentTimeMillis() - start) + " ms");

start=System.currentTimeMillis();

getSerializableObject();

System.out.println("Kryo 反序列化时间:" + (System.currentTimeMillis() - start) + " ms");

}public static void setSerializableObject() throwsFileNotFoundException{

Kryo kryo= newKryo();

kryo.setReferences(false);

kryo.setRegistrationRequired(false);

kryo.setInstantiatorStrategy(newStdInstantiatorStrategy());

kryo.register(Simple.class);

Output output= new Output(new FileOutputStream("D:/file1.bin"));for (int i = 0; i < 100000; i++) {

Map map = new HashMap(2);

map.put("zhang0", i);

map.put("zhang1", i);

kryo.writeObject(output,new Simple("zhang"+i,(i+1),map));

}

output.flush();

output.close();

}public static voidgetSerializableObject(){

Kryo kryo= newKryo();

kryo.setReferences(false);

kryo.setRegistrationRequired(false);

kryo.setInstantiatorStrategy(newStdInstantiatorStrategy());

Input input;try{

input= new Input(new FileInputStream("D:/file1.bin"));

Simple simple=null;while((simple=kryo.readObject(input, Simple.class)) != null){//System.out.println(simple.getAge() + " " + simple.getName() + " " + simple.getMap().toString());

}

input.close();

}catch(FileNotFoundException e) {

e.printStackTrace();

}catch(KryoException e){

}

}

}

4、测试结果对比

java原生序列化时间:8281 ms java原生反序列化时间:5899 ms

Kryo 序列化时间:630 ms Kryo 反序列化时间:15 ms

经过对比,可以发现kryo是java原生序列化性能十几倍

avro和java原生序列化的区别,java原生序列化和Kryo序列化性能比较相关推荐

  1. float 与 double、隐式类型转换、switch、重写与重载、Java 与 C++ 的区别、JRE or JDK

    1.float 与 double 1.1 字面量属于 double 类型,不能直接将 1.1 直接赋值给 float 变量,因为这是向下转型. // float f = 1.1; Java 不能隐式执 ...

  2. java long和int 区别_java long int的区别

    java long int的区别 java中long和int都属于整型,为什么还要细分为long和int两种数据类型呢?这是因为它们代表的大小不一样.具体区别如下: 1.区别1 16位系统:long是 ...

  3. 【Java 8 新特性】Java Supplier示例

    Java Supplier是一个功能接口,代表结果的提供者. Supplier的功能方法是get(). 一个Supplier可以通过lambda表达式.方法引用或默认构造函数来实例化. Supplie ...

  4. java分布性,大连培训java程序员(java分布性)

    大连培训java程序员,千里之行,始于足下,学习大连java培训就是我们行千里的足.想要行的足够远就得去深刻了解面向对象的Java语言,Java语言的稳健性,Java的工作原理,java分布性,Jav ...

  5. spark之kryo序列化及其使用

    spark之kryo序列化 spark之kryo 序列化 Spark 中使用 Kryo序列化 中文切词案例: spark之kryo 序列化 1.定义:把对象转换为字节序列的过程称为对象的序列化. 把字 ...

  6. spark之kryo 序列化

    几乎所有的资料都显示kryo 序列化方式优于java自带的序列化方式,而且在spark2.*版本中都是默认采用kryo 序列化.因此本文将做kryo 做一个测试以验证其性能. 1.先给出定义:     ...

  7. 【java】java原生序列化和Kryo序列化性能实例对比分析

    1.美图 2.概述 最近几年,各种新的高效序列化方式层出不穷,不断刷新序列化性能的上限,最典型的包括: 专门针对Java语言的:Kryo,FST等等 跨语言的:Protostuff,ProtoBuf, ...

  8. java和python的web自动化有什么区别-Java 和 Python 有哪些区别?

    区别 一.python虚拟机没有java强,java虚拟机是java的核心,python的核心是可以很方便地使用c语言函数或c++库. 二.python是全动态性的,可以在运行时自己修改自己的代码,j ...

  9. python和java一样吗-python 和 java 的区别

    区别 一.python虚拟机没有java强,java虚拟机是java的核心,python的核心是可以很方便地使用c语言函数或c++库. 二.python是全动态性的,可以在运行时自己修改自己的代码,j ...

最新文章

  1. 【控制】《多智能体系统的协同群集运动控制》陈杰老师-第6章-参数不确定的高阶非线性多智能体系统一致性控制
  2. pandas的str函数的一些功能
  3. 得到singleton类?
  4. Python Django单表增删改操作
  5. 让一个非窗口组件(non-windowed component)可以接受来自Windows的消息
  6. go语言linux下开发工具,LiteIDE 开发工具指南 (Go语言开发工具)
  7. 浅谈URL生成方式的演变
  8. matlab拟合三维直线,三维数据拟合直线
  9. 2048小游戏——网页版(提高篇)
  10. C51单片机实验-LCD1602显示实验
  11. 大数据CAP原则(CAP定理)、BASE理论
  12. 切蛋糕问题【小学二年级奥数】
  13. Excel批量删除文本左侧n-m个空格的2种操作
  14. 特征提取 - 海森矩阵(Hessian Matrix)及一个用例(图像增强)
  15. 【监控】zabbix
  16. Mapper 重命名问题
  17. nginx 的离线编译安装
  18. 女人要怀有一颗珍惜之心
  19. linux下ant编译android,linux(以ubuntu为例)下Android利用ant自动编译、修改配置文件、批量多渠道,打包生...
  20. 【详解一】Nand Flash 编写驱动之前要了解的知识

热门文章

  1. [导入]给家人补补钙!双莲炖腔骨
  2. vue $data data
  3. 如何编写一个webpack插件
  4. 如何把apdu[decode_len]打印出来
  5. 运用java集合Collections对List进行max和min操作
  6. ASP.NET MVC3 上传头像图片并截图
  7. Android自定义退出弹出框
  8. pku 3159 Candies 差分约束
  9. [VS2005]一个简单的CodeSnippet —— 生成类的构造函数。
  10. C#文件操作(IO流 摘抄)