java序列化-如何测试不同序列化方式的性能?

575 阅读1分钟

如何测试性能?

主要看

  1. 字节数量
  2. 耗时

这两个指标,就是衡量指标。

字节数量指的是,序列化之后的内容的长度,即字节长度。

耗时,指的是,序列化和反序列化的耗时。

而且,两个指标呈正比,即字节数量越多,一般耗时就越久。

如何得到序列化之后的内容的字节数量?

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.人不可读

image.png

fastjson

特点
1.其实就是json格式的字符串,人可读。
2.另外,没有包含数据类型什么的,就是字段的名字和值。所以,字节数量更少。

image.png

参考

juejin.cn/post/713015…