java序列化 和 json序列化 速度对比

  1. 结论

    • 数据包大小区别不大。
    • 但是小对象 json 快,约快3倍。
    • 大对象java的序列化速度慢慢追平json(单个对象json长度3000的左右追平),这个可能和java对象转json有关系,但是装换这步在序列化前必不可可少
    • 另外序列化和不止和对象大小有关还和字段数量有关系,这个因素我没测试,我这里都是7字段。
    • 数据包大小总是 java 比 json小5M,应该是这5MB的差距只和序列化的次数有关(我这里都是100W次)和字段名有关,json比java对了字段名java的字段名应该有特殊处理,或者直接省略了。
  2. 实验过程数据记录

    • goods 是空的时候,100W次对象序列化

       * goods 是空的时候,100W次对象序列化
       *        java序列化耗时:6059
       *        json耗时:1891
       *         结论json速度是java的3倍
      
    • goods json字符串长度 158字符的时候,10W次序列化

       *      速度对比:
       *              java序列化耗时:2790
       *              json耗时:959
       *              结论json速度是java的3倍
       *
       *      文件大小比对:
       *                  java的10.6MB
       *                  json的15MB
      
    • goods json字符串长度 477 字符的时候,10W次序列化(goods只有7个属性,我是通过改变随机生成的字段长度老控制的)

       *      速度对比:
       *              java序列化耗时:3377
       *              json耗时:2030
       *              结论json比java少耗时50%
       *
       *      文件大小比对:
       *                  java的40.7MB
       *                  json的45.4MB
      
    • goods json字符串长度 3357 字符的时候,10W次序列化(goods只有7个属性,我是通过改变随机生成的字段长度老控制的)

       *      速度对比:
       *              java序列化耗时:9627
       *              json耗时:10119
       *              结论json速度已经java序列化慢了
       *
       *      文件大小比对:
       *                  java的315MB
       *                  json的320MB
      
  3. 测试代码如下

    public class SerializeTest {
    
        int size = 10000*10;
    
    
        @Test
        public void goodsSize() throws IOException {
            System.out.println("goods示例:" + JSONUtil.toJsonStr( Goods.randomGoods() ));
            System.out.println("goods示例:" + JSONUtil.toJsonStr( Goods.randomGoods() ).length());
        }
    
        @Test
        public void java() throws IOException {
            StopWatch stopWatch = new StopWatch();
            stopWatch.start();
    
            List<Goods> list = new ArrayList<>();
            for( int i=0;i<size;i++ ){
                //list.add( Goods() );
                list.add( Goods.randomGoods() );
            }
            File file = new File("C:\\Users\\ZHANGYUKUN\\Desktop\\java.data");
            FileOutputStream fileInputStream = new FileOutputStream(file);
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileInputStream);
    
            for (Goods goods : list) {
            	//这个序列化使用了java的序列化,必须实现Serializable接口,否则要报错
                objectOutputStream.writeObject( goods );
            }
    
            objectOutputStream.flush();
            objectOutputStream.close();
            fileInputStream.close();
    
            stopWatch.stop();
            long time = stopWatch.getLastTaskTimeMillis();
            System.out.println("java序列化耗时:" + time);
    
        }
    
    
        @Test
        public void json() throws IOException {
            StopWatch stopWatch = new StopWatch();
            stopWatch.start();
    
            List<Goods> list = new ArrayList<>();
            for( int i=0;i<size;i++ ){
                //list.add( new Goods() );
                list.add( Goods.randomGoods() );
            }
    
            File file = new File("C:\\Users\\ZHANGYUKUN\\Desktop\\json.data");
            FileOutputStream fileInputStream = new FileOutputStream(file);
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileInputStream);
    
            for (Goods goods : list) {
                outputStreamWriter.write( JSONUtil.toJsonStr( goods ) );
            }
    
            outputStreamWriter.flush();
            outputStreamWriter.close();
            fileInputStream.close();
    
            stopWatch.stop();
            long time = stopWatch.getLastTaskTimeMillis();
            System.out.println("json耗时:" + time);
    
        }
    
    }
    
  4. goods结构如下,改变good的长度通过 randomGoods 方法里面随机生成字段长度

    package com.lomi.entity;
    
    import com.lomi.utils.CodeUtil;
    
    import cn.hutool.core.util.IdUtil;
    import com.lomi.utils.IdUtils;
    
    import java.io.Serializable;
    import java.util.Arrays;
    import java.util.Date;
    import java.util.HashSet;
    import java.util.Set;
    
    public class Goods implements Serializable {
        private Long id;
    
        private Date createDate;
    
        private String name;
    
        private Integer stock;
    
    	private String des;
    
        private String des2;
    
        private String data;
    
        public Date getCreateDate() {
            return createDate;
        }
    
        public void setCreateDate(Date createDate) {
            this.createDate = createDate;
        }
    
        public Goods(String name ) {
        	this.name = name;
        }
        public Goods() {
    
        }
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
        
        public String name(int  i) {
            return "name????" + i;
        }
    
        public Goods setName(String name) {
            this.name = name == null ? null : name.trim();
            return this;
        }
    
        public Integer getStock() {
            return stock;
        }
    
        public void setStock(Integer stock) {
            this.stock = stock;
        }
    
        public String getDes() {
            return des;
        }
    
        public void setDes(String des) {
            this.des = des == null ? null : des.trim();
        }
    
        public String getData() {
            return data;
        }
    
        public void setData(String data) {
            this.data = data == null ? null : data.trim();
        }
    	public String getDes2() {
    		return des2;
    	}
    
    	public void setDes2(String des2) {
    		this.des2 = des2;
    	}
    
    
        @Override
        public String toString() {
            return "Goods{" +
                    "id=" + id +
                    ", createDate=" + createDate +
                    ", name='" + name + '\'' +
                    ", stock=" + stock +
                    ", des='" + des + '\'' +
                    ", des2='" + des2 + '\'' +
                    ", data='" + data + '\'' +
                    '}';
        }
    
        public static Goods randomGoods() {
        	Goods goods = new Goods();
    		goods.setId(IdUtils.nextId());
    		goods.setData(  CodeUtil.getRandomNum18() );
    		goods.setDes( CodeUtil.randomCode(16) );  //我通过改变这几个属性的长度来改变goods的大小的
    		goods.setDes2( CodeUtil.randomCode(16) ); //我通过改变这几个属性的长度来改变goods的大小的
    		goods.setName( CodeUtil.randomCode(3) );  //我通过改变这几个属性的长度来改变goods的大小的
    		goods.setStock( Integer.valueOf( CodeUtil.randomNumCode(4) ) ); 
            goods.setCreateDate( new Date());
    		
        	return goods;
        }
    
    
    
    
    }
    

posted on 2023-04-03 21:51  zhangyukun  阅读(960)  评论(0编辑  收藏  举报

导航