记一次后台存储方案优化

序列化方案

  1. Json
  2. protobuf
  3. JDK Serializable

测试方法

 String line = "{很复杂的json,需要保密}";
        DataStructure d = json.fromJson(line, DataStructure.class);
        long time = System.currentTimeMillis();
        long size = 0;
        for(int i = 0;i< 1000000; i++){
            d.setCostTime(i);
            String b = json.toJson(d);
            size = size + b.getBytes().length;
        }

        System.out.println("time :" + (System.currentTimeMillis() - time) +",and size:" + size);

测试结果

  • 序列化:
方式耗时(毫秒)结构化存储数据大小(byte)
json8954777888890
protobuf25255517983488
protobuf33247357983488
jdk72811067000000

* 反序列化:

方式耗时(毫秒)
json5107
protobuf24082
protobuf33123
jdk22779

插曲

测试过程种出现过一次异常:

序列化:

方式耗时(毫秒)结构化存储数据大小(byte)
protobuf228653517983488
protobuf325878357983488

反序列化:

方式耗时(毫秒)
protobuf322779

经查,由于在Java Object 转 pb Object 过程中,使用了反射

Class<? extends DataStructure> clazz = DataStructure.class;
        Field[] fields = clazz.getDeclaredFields();
        for(Field field : fields){
            String name = field.getName();
            String up = captureName(name);
            if(field.getAnnotation(SerializableTag.class) != null)
            //填入数据
        }

这段代码导致速度下降了6~8倍

总结

  1. protobuf 性能全面优于 Json,速度加快大概在30%~40% 左右,存储数据量下降30%+
  2. 由于项目中的 Java Object 带Map属性在使用支持Map的 protobuf 3.0 时,性能还能有大幅提升 (目前spark 只支持2.5 Map 使用jdk序列化,再以byte方式序列化到pb)
  3. 线上环境全面使用 set,get 方法替代反射注入,提升性能(不要怕麻烦)。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值