如何测试性能?
主要看
- 字节数量
- 耗时
这两个指标,就是衡量指标。
字节数量指的是,序列化之后的内容的长度,即字节长度。
耗时,指的是,序列化和反序列化的耗时。
而且,两个指标呈正比,即字节数量越多,一般耗时就越久。
如何得到序列化之后的内容的字节数量?
java序列化
代码
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
// 序列化
// File file = new File("Person.txt");
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
Person Person = new Person("javaself", 22, "上海");
ObjectOutputStream oout = new ObjectOutputStream(buffer);
oout.writeObject(Person); //把对象转换为二进制(即字节数组)
oout.close();
// java序列化方式-序列化之后的字节数量
byte[] bytes = buffer.toByteArray();
// log.info("字节数量:{}",bytes.length); //211
// 反序列化
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
ObjectInputStream oin = new ObjectInputStream(byteArrayInputStream);
Object newPerson2 = oin.readObject();//从字节数组恢复为对象
oin.close();
}
long end = System.currentTimeMillis();
log.info("耗时:{}ms",end-start); //循环10000次,耗时559ms
字节数量是:211
log.info("字节数量:{}",bytes.length); //211
fastjson
代码
//序列化
Person person = new Person("javaself", 22, "上海");
byte[] bytes = JSON.toJSONBytes(person);
// log.info("字节长度:{}", bytes.length); //47
//写字节数组到文件
// FileUtils.saveFile("Person1.txt", bytes);
//反序列化
Person person1 = JSON.parseObject(bytes, Person.class);
字节数量是:47
log.info("字节长度:{}", bytes.length); //47
总结
一个是几十个字节,一个是几百个字节,差了好几倍。
所以,耗时应该也是fastjson快,因为fastjson的内容更少。
如何验证耗时?
java序列化
代码同上,就是循环10000次。
@Test
void javaSer2() throws IOException, ClassNotFoundException {
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
// 序列化
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
Person Person = new Person("javaself", 22, "上海");
ObjectOutputStream oout = new ObjectOutputStream(buffer);
oout.writeObject(Person); //把对象转换为二进制(即字节数组)
oout.close();
// java序列化方式-序列化之后的字节数量
byte[] bytes = buffer.toByteArray();
// log.info("字节数量:{}",bytes.length); //211
// 反序列化
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
ObjectInputStream oin = new ObjectInputStream(byteArrayInputStream);
Object newPerson2 = oin.readObject();//从字节数组恢复为对象
oin.close();
}
long end = System.currentTimeMillis();
log.info("耗时:{}ms",end-start); //循环10000次,耗时559ms
}
耗时:循环10000次,耗时559ms。
log.info("耗时:{}ms",end-start); //循环10000次,耗时559ms
fastjson
也是代码同上,也是循环10000次。
@Test
void fastjsonSer() throws Exception {
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
//序列化
Person person = new Person("javaself", 22, "上海");
byte[] bytes = JSON.toJSONBytes(person);
// log.info("字节长度:{}", bytes.length); //47
//写字节数组到文件
// FileUtils.saveFile("Person1.txt", bytes);
//反序列化
Person person1 = JSON.parseObject(bytes, Person.class);
}
long end = System.currentTimeMillis();
log.info("耗时:{}ms",end-start); //循环10000次,耗时162ms //单次耗时不到1ms,大概微秒级别。
}
耗时:循环10000次,耗时162ms。
log.info("耗时:{}ms",end-start); //循环10000次,耗时162ms //单次耗时不到1ms,大概微秒级别。
总结
一个是100多ms,一个500多ms,速度也是差了好几倍。
基本上,和序列化之后的内容的字节数量呈正比,即字节数量更少的速度更快。
所以,fastjson更快。
序列化之后的内容,长什么样?
java序列化
2个特点
1.包含了数据的数据类型
2.人不可读
fastjson
特点
1.其实就是json格式的字符串,人可读。
2.另外,没有包含数据类型什么的,就是字段的名字和值。所以,字节数量更少。