一、起因
这次项目中客户端和服务器端的通讯为了简单使用了Java的序列化功能,需要传输的地方直接构造一个HashMap传过去就可了,相当的简单。可是看以前做过的系统中都是使用字符串传输的,要不是直接构造一个特殊的字符串序列,要不就是构造一个xml文件都没有直接使用Java的序列化功能。又听说序列化的性能很差,所以在总结这个项目的客户端与服务端的数据传送之前先调查一下,序列化的性能差多少。
二、测试程序
三、测试结果
62
16
141
15
接近10倍的性能优势,怪不得日本人提供的框架都是使用字符串来传输数据的。
这次项目中客户端和服务器端的通讯为了简单使用了Java的序列化功能,需要传输的地方直接构造一个HashMap传过去就可了,相当的简单。可是看以前做过的系统中都是使用字符串传输的,要不是直接构造一个特殊的字符串序列,要不就是构造一个xml文件都没有直接使用Java的序列化功能。又听说序列化的性能很差,所以在总结这个项目的客户端与服务端的数据传送之前先调查一下,序列化的性能差多少。
二、测试程序
import
java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class TestSerialize {
public static void main(String[] args) throws Exception {
String test = "this is a string.";
Integer textInt = new Integer(10000);
// 字符串性能测试
testSerailize(test);
testGetBytes(test);
// 整型性能测试
testSerailize(textInt);
testGetBytes(textInt);
}
// 序列化
private static void testSerailize(Object test) throws Exception {
long startTime = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
new ObjectOutputStream(byteArrayOutputStream).writeObject(test);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
ObjectInputStream inputStream = new ObjectInputStream(byteArrayInputStream);
inputStream.readObject();
}
System.out.println(System.currentTimeMillis() - startTime);
}
// 字符串转换为byte数组,在转换为字符串
private static void testGetBytes(String test) {
long startTime = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
byte[] bytes = test.getBytes();
new String(bytes);
}
System.out.println(System.currentTimeMillis() - startTime);
}
// Integer->String->byte[]->String->Integer
private static void testGetBytes(Integer test) {
long startTime = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
byte[] bytes = test.toString().getBytes();
Integer.parseInt(new String(bytes));
}
System.out.println(System.currentTimeMillis() - startTime);
}
}
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class TestSerialize {
public static void main(String[] args) throws Exception {
String test = "this is a string.";
Integer textInt = new Integer(10000);
// 字符串性能测试
testSerailize(test);
testGetBytes(test);
// 整型性能测试
testSerailize(textInt);
testGetBytes(textInt);
}
// 序列化
private static void testSerailize(Object test) throws Exception {
long startTime = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
new ObjectOutputStream(byteArrayOutputStream).writeObject(test);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
ObjectInputStream inputStream = new ObjectInputStream(byteArrayInputStream);
inputStream.readObject();
}
System.out.println(System.currentTimeMillis() - startTime);
}
// 字符串转换为byte数组,在转换为字符串
private static void testGetBytes(String test) {
long startTime = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
byte[] bytes = test.getBytes();
new String(bytes);
}
System.out.println(System.currentTimeMillis() - startTime);
}
// Integer->String->byte[]->String->Integer
private static void testGetBytes(Integer test) {
long startTime = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
byte[] bytes = test.toString().getBytes();
Integer.parseInt(new String(bytes));
}
System.out.println(System.currentTimeMillis() - startTime);
}
}
三、测试结果
62
16
141
15
接近10倍的性能优势,怪不得日本人提供的框架都是使用字符串来传输数据的。