序列化框架性能對比

100萬簡單實體序列化結果如下

=testJdkSerialize=
耗時1349ms
=testJdkSerialize=
=testFSTSerialize=
耗時331ms
=testFSTSerialize=
=testFastJsonSerialize=
耗時300ms
=testFastJsonSerialize=
=testGsonSerialize=
耗時675ms
=testGsonSerialize=
=testJacksonSerialize=
耗時6368ms
=testJacksonSerialize=
=testKryoSerialize=
耗時180ms
=testKryoSerialize=

pom依賴

<!-- fastjson -->
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.51</version>
</dependency>

<!-- fst -->
<dependency>
  <groupId>de.ruedigermoeller</groupId>
  <artifactId>fst</artifactId>
  <version>2.57</version>
</dependency>

<!-- gson -->
<dependency>
  <groupId>com.google.code.gson</groupId>
  <artifactId>gson</artifactId>
  <version>2.8.5</version>
</dependency>

<!-- jackson -->
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-core</artifactId>
  <version>2.9.6</version>
</dependency>

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.6</version>
</dependency>

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-annotations</artifactId>
  <version>2.9.6</version>
</dependency>

<!-- kryo -->
<dependency>
  <groupId>com.esotericsoftware</groupId>
  <artifactId>kryo</artifactId>
  <version>4.0.0</version>
</dependency>

代碼如下

package com.study.netty.lesson7;

import java.util.List;

public class SerializableTest {
	private final static int COUNT = 1000000;

	public static void main(String[] args) {
		User user = new User();
		user.setName("serializable");
		user.setAge(100);

//		testUser(user);
//
//		List<User> list = new ArrayList<User>();
//		list.add(user);
//		testUserList(list);

		testJdkSerialize(user);
		testFSTSerialize(user);
		testFastJsonSerialize(user);
		testGsonSerialize(user);
		testJacksonSerialize(user);
		testKryoSerialize(user);
	}

	private static void testJdkSerialize(User user) {
		System.out.println("=====testJdkSerialize=====");
		long t1 = System.currentTimeMillis();
		for (int i = 0; i < COUNT; i++) {
			JdkSerializable.serialize(user);
		}
		long t2 = System.currentTimeMillis();
		System.out.println("耗時" + (t2 - t1) + "ms");
		System.out.println("=====testJdkSerialize=====");
	}

	private static void testFSTSerialize(User user) {
		System.out.println("=====testFSTSerialize=====");
		long t1 = System.currentTimeMillis();
		for (int i = 0; i < COUNT; i++) {
			FSTSerializable.serialize(user);
		}
		long t2 = System.currentTimeMillis();
		System.out.println("耗時" + (t2 - t1) + "ms");
		System.out.println("=====testFSTSerialize=====");
	}

	private static void testFastJsonSerialize(User user) {
		System.out.println("=====testFastJsonSerialize=====");
		long t1 = System.currentTimeMillis();
		for (int i = 0; i < COUNT; i++) {
			FastJsonSerializable.serialize(user);
		}
		long t2 = System.currentTimeMillis();
		System.out.println("耗時" + (t2 - t1) + "ms");
		System.out.println("=====testFastJsonSerialize=====");
	}

	private static void testGsonSerialize(User user) {
		System.out.println("=====testGsonSerialize=====");
		long t1 = System.currentTimeMillis();
		for (int i = 0; i < COUNT; i++) {
			GsonSerializable.serialize(user);
		}
		long t2 = System.currentTimeMillis();
		System.out.println("耗時" + (t2 - t1) + "ms");
		System.out.println("=====testGsonSerialize=====");
	}

	private static void testJacksonSerialize(User user) {
		System.out.println("=====testJacksonSerialize=====");
		long t1 = System.currentTimeMillis();
		for (int i = 0; i < COUNT; i++) {
			JacksonSerializable.serialize(user);
		}
		long t2 = System.currentTimeMillis();
		System.out.println("耗時" + (t2 - t1) + "ms");
		System.out.println("=====testJacksonSerialize=====");
	}

	private static void testKryoSerialize(User user) {
		System.out.println("=====testKryoSerialize=====");
		long t1 = System.currentTimeMillis();
		for (int i = 0; i < 100000; i++) {
			KryoSerializable.serialize(user);
		}
		long t2 = System.currentTimeMillis();
		System.out.println("耗時" + (t2 - t1) + "ms");
		System.out.println("=====testKryoSerialize=====");
	}

	private static void testUserList(List<User> list) {
		System.out.println("=====testUserList=====");
		// 序列化
		byte[] jdkSerialize = JdkSerializable.serialize(list);
		byte[] fstSerialize = FSTSerializable.serialize(list);
		String fastjsonSerialize = FastJsonSerializable.serialize(list);
		String gsonSerialize = GsonSerializable.serialize(list);
		String jacksonSerialize = JacksonSerializable.serialize(list);
		byte[] kryoSerialize = KryoSerializable.serialize(list);

		// 反序列化
		System.out.println(JdkSerializable.deserialize(jdkSerialize));
		System.out.println(FSTSerializable.deserialize(fstSerialize));
		System.out.println(FastJsonSerializable.deserialize(fastjsonSerialize, List.class));
		System.out.println(GsonSerializable.deserialize(gsonSerialize, List.class));
		System.out.println(JacksonSerializable.deserialize(jacksonSerialize, List.class));
		System.out.println(KryoSerializable.deserialize(kryoSerialize));
		System.out.println("=====testUserList=====");
	}

	private static void testUser(User user) {
		System.out.println("=====testUser=====");
		// 序列化
		byte[] jdkSerialize = JdkSerializable.serialize(user);
		byte[] fstSerialize = FSTSerializable.serialize(user);
		String fastjsonSerialize = FastJsonSerializable.serialize(user);
		String gsonSerialize = GsonSerializable.serialize(user);
		String jacksonSerialize = JacksonSerializable.serialize(user);
		byte[] kryoSerialize = KryoSerializable.serialize(user);

		// 反序列化
		System.out.println(JdkSerializable.deserialize(jdkSerialize));
		System.out.println(FSTSerializable.deserialize(fstSerialize));
		System.out.println(FastJsonSerializable.deserialize(fastjsonSerialize, User.class));
		System.out.println(GsonSerializable.deserialize(gsonSerialize, User.class));
		System.out.println(JacksonSerializable.deserialize(jacksonSerialize, User.class));
		System.out.println(KryoSerializable.deserialize(kryoSerialize));
		System.out.println("=====testUser=====");
	}
}

User.Java

package com.study.netty.lesson7;

import java.io.Serializable;

public class User implements Serializable {
	private static final long serialVersionUID = -397412467418504005L;

	private String name;

	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

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

	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + "]";
	}

}

JdkSerializable.java

package com.study.netty.lesson7;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class JdkSerializable {
	public static byte[] serialize(Object obj) {
		try {
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			ObjectOutputStream oos = new ObjectOutputStream(baos);
			oos.writeObject(obj);
			byte[] bs = baos.toByteArray();
			baos.close();
			oos.close();
			return bs;
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

	public static Object deserialize(byte[] bits) {
		try {
			ByteArrayInputStream bais = new ByteArrayInputStream(bits);
			ObjectInputStream ois = new ObjectInputStream(bais);
			Object obj = ois.readObject();
			bais.close();
			ois.close();
			return obj;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

}

FSTSerializable.java

package com.study.netty.lesson7;

import java.io.Serializable;

import org.nustaq.serialization.FSTConfiguration;

public class FSTSerializable {
	private static FSTConfiguration configuration = FSTConfiguration.createDefaultConfiguration();

	public static byte[] serialize(Object obj) {
		return configuration.asByteArray((Serializable) obj);
	}

	public static Object deserialize(byte[] sec) {
		return configuration.asObject(sec);
	}
}

FastJsonSerializable.java

package com.study.netty.lesson7;

import com.alibaba.fastjson.JSON;

public class FastJsonSerializable {
	public static String serialize(Object obj) {
		String json = JSON.toJSONString(obj);
		return json;
	}

	public static Object deserialize(String json, Class<?> clazz) {
		Object obj = JSON.parseObject(json, clazz);
		return obj;
	}

}

GsonSerializable.java

package com.study.netty.lesson7;

import com.google.gson.Gson;

public class GsonSerializable {
	private static Gson gson = new Gson();

	public static String serialize(Object obj) {
		String json = gson.toJson(obj);
		return json;
	}

	public static Object deserialize(String json, Class<?> clazz) {
		Object obj = gson.fromJson(json, clazz);
		return obj;
	}
}

JacksonSerializable.java

package com.study.netty.lesson7;

import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonSerializable {
	public static String serialize(Object obj) {
		ObjectMapper mapper = new ObjectMapper();
		String json = null;
		try {
			json = mapper.writeValueAsString(obj);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return json;
	}

	public static Object deserialize(String json, Class<?> clazz) {
		ObjectMapper mapper = new ObjectMapper();
		Object obj = null;
		try {
			obj = mapper.readValue(json, clazz);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return obj;
	}
}

KryoSerializable.java

package com.study.netty.lesson7;

import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;

public class KryoSerializable {
	private static Kryo kryo = new Kryo();

	public static byte[] serialize(Object obj) {
		byte[] buffer = new byte[2048];
		Output output = new Output(buffer);
		kryo.writeClassAndObject(output, obj);
		byte[] bs = output.toBytes();
		output.close();
		return bs;
	}

	public static Object deserialize(byte[] src) {
		Input input = new Input(src);
		Object obj = kryo.readClassAndObject(input);
		input.close();
		return obj;
	}
}

碼流大小測試(略)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章