fastjson 和 serialize 差距有点多,是我的写法有问题吗

天天笑笑 发布于 2014/02/09 17:54
阅读 1K+
收藏 0

【领华为电脑包】容器化时代到来!跳转机分配问题终于“有救”了!>>>

在选型一个网络数据传输问题,粗略比较了java Serialize 和 json 传输两种方式,结果如下:

环境:win7 jdk8   fastjson vs java serialize

比较结果如下(ms):

serialize use:385
deserialize use:665
list size :100000
json to string use:873
string to json use:49776
list size :100000

数据包大小:

serial.ser 16KB

json.ser 64KB

这结果确实让我有点惊讶,是我写法有问题吗?

代码:


public static void main(String[] args) throws Exception
    {
        List list = new ArrayList();

        for (int i = 0; i < 100000; i++)
        {
            PrdItem prdItem = new PrdItem();
            prdItem.setCptCode("a");
            prdItem.setCptName("肉品");
            prdItem.setId("100001");
            prdItem.setPrdId("A1001");
            prdItem.setPrdName("某某食品");
            prdItem.setPrice(BigDecimal.ZERO);
            prdItem.setPycode("pycode");
            prdItem.setSpec("100包/件");
            prdItem.setStkChkMod("D");
            prdItem.setSunit("件");
            list.add(prdItem);
        }
        long timeBeg = System.currentTimeMillis();
        FileOutputStream fileO = new FileOutputStream("d:\\serial.ser");
        GZIPOutputStream gos = new GZIPOutputStream(fileO);
        ObjectOutputStream oos = new ObjectOutputStream(gos);
        oos.writeObject(list);
        oos.flush();
        oos.close();
        System.out.println("serialize use:" + (System.currentTimeMillis() - timeBeg));
        timeBeg = System.currentTimeMillis();
        FileInputStream fileI = new FileInputStream("d:\\serial.ser");
        GZIPInputStream gis = new GZIPInputStream(fileI);
        ObjectInputStream oin = new ObjectInputStream(gis);
        list = (List) oin.readObject();
        oin.close();
        System.out.println("deserialize use:" + (System.currentTimeMillis() - timeBeg));
        System.out.println("list size :" + list.size());

        timeBeg = System.currentTimeMillis();
        fileO = new FileOutputStream("d:\\json.ser");
        gos = new GZIPOutputStream(fileO);
        gos.write(JSON.toJSONBytes(list));
        gos.flush();
        gos.close();
        System.out.println("json to string use:" + (System.currentTimeMillis() - timeBeg));
        timeBeg = System.currentTimeMillis();
        fileI = new FileInputStream("d:\\json.ser");
        gis = new GZIPInputStream(fileI);
        byte[] bs = StreamUtil.readBytes(gis);
        gis.close();
        list = JSON.parseArray(new String(bs), PrdItem.class);
        System.out.println("string to json use:" + (System.currentTimeMillis() - timeBeg));
        System.out.println("list size :" + list.size());

    }



加载中
0
天天笑笑
天天笑笑

刚才看到Kryo发布,加了Kryo一起测试。发现kryo的系列化和反系列化速度最快 ,生成的文件也最小

timeBeg = System.currentTimeMillis();
        fileO = new FileOutputStream("d:\\kryo.ser");
        Kryo kryo = new Kryo();
        gos = new GZIPOutputStream(fileO);
        Output output = new Output(gos);
        kryo.writeObject(output, list);
        output.flush();
        output.close();
        System.out.println("kryo serialize use:" + (System.currentTimeMillis() - timeBeg));
        timeBeg = System.currentTimeMillis();
        fileI = new FileInputStream("d:\\kryo.ser");
        gis = new GZIPInputStream(fileI);
        Input input = new Input(gis);
        list = kryo.readObject(input, ArrayList.class);
        input.close();
        System.out.println("kryo deserialize use:" + (System.currentTimeMillis() - timeBeg));
        System.out.println("list size :" + list.size());

测试结果(毫秒):

serialize use:385
deserialize use:665
list size :100000
json to string use:873
string to json use:49776
list size :100000
kryo serialize use:296
kryo deserialize use:339
list size :100000

数据包大小:

serial.ser 16KB
json.ser 64KB
kyro.ser 4KB

0
youngjdong
youngjdong
要分开来运行,3个连着测试,居然kryo最慢
天天笑笑
天天笑笑
jdk 8 b128, fastjson-1.1.38.jar, kryo-2.23.0.jar
天天笑笑
天天笑笑
我也分开测试过,没啥差别,不管是系列化还是反系列化依然是kryo最快,特别是反系列化,kryo的速度是fastjson的120倍左右,所以我自己都怀疑是不是fastjson的写法有问题。
返回顶部
顶部