专栏首页让技术和时代并行java原生序列化慢在哪里?

java原生序列化慢在哪里?

Java原生序列化和二进制序列化性能比较

序列化速度

package com.clq.netty.serializable;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.nio.ByteBuffer;

/**
 * Created by clq on 2018/7/20.
 */
public class UserInfo implements Serializable{

    private String name;
    private int id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public byte[] CodeC(ByteBuffer byteBuffer) {
        byteBuffer.clear();
       // ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
        byte[] bytes = this.getName().getBytes();
        byteBuffer.putInt(bytes.length);
        byteBuffer.put(bytes);
        byteBuffer.putInt(this.getId());
        byteBuffer.flip();
        bytes = null;
        byte [] bytes1 = new byte[byteBuffer.remaining()];
        byteBuffer.get(bytes1);
        return bytes1;
    }

    public static void main(String[] args) throws IOException {
        UserInfo userInfo = new UserInfo();
        userInfo.setId(1234);
        userInfo.setName("Welcome to Serializable");
        long begin = System.currentTimeMillis();
        for(int i=0; i<1000000; i++) {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(userInfo);
            oos.flush();
            oos.close();
            byte[] bytes = bos.toByteArray();
            bos.close();
        }
        System.out.println("Java序列化耗时: "+(System.currentTimeMillis()-begin)+"ms");
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
        Long start =System.currentTimeMillis();
        for(int i=0;i<1000000;i++) {
            byte[] bytes = userInfo.CodeC(byteBuffer);
        }
        System.out.println("二进制序列化:"+(System.currentTimeMillis()-start)+"ms");
        // System.out.println("JDK Serializable length:"+bytes.length);
       // System.out.println("NIO Serializable length:"+userInfo.CodeC().length);
    }
}

打印结果: Java序列化耗时: 1388ms 二进制序列化:118ms java原生序列化的速度是二进制序列化速度的 8.19%

序列化大小

public static void main(String[] args) throws IOException {
        UserInfo userInfo = new UserInfo();
        userInfo.setId(1234);
        userInfo.setName("Welcome to Serializable");
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(userInfo);
        oos.flush();
        oos.close();
        byte[] bytes = bos.toByteArray();
        bos.close();
        System.out.println("JDK Serializable length:"+bytes.length);
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        System.out.println("NIO Serializable length:"+userInfo.CodeC(buffer).length);
    }

JDK Serializable length:119 二进制 Serializable length:31 jdk序列化大小是二进制序列化大小的3.83倍

二进制字节码

java序列化

aced 0005 7372 0023 636f 6d2e 636c 712e
6e65 7474 792e 7365 7269 616c 697a 6162
6c65 2e55 7365 7249 6e66 6fb5 d8bd 7f01
280b d402 0002 4900 0269 644c 0004 6e61
6d65 7400 124c 6a61 7661 2f6c 616e 672f
5374 7269 6e67 3b78 7000 0004 d274 0017
5765 6c63 6f6d 6520 746f 2053 6572 6961
6c69 7a61 626c 65

hex模式查看

二进制序列化

0000 0017 5765 6c63 6f6d 6520 746f 2053   
6572 6961 6c69 7a61 626c 6500 0004 efbf
bd

hex模式查看

原因分析

java的序列化后的码流可以得出: Java本身并不支持跨语言,因为加入了序列化版本号,类名等信息,所以导致码流变大,速度变慢。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java中介者设计模式

    中介者设计模式是一种非常常见的设计模式,其中我们最为熟悉的就是我们的MVC框架,其中的C作为控制器就是一个具体的中介者,它的作用是把业务逻辑(Model),和视...

    用户5166556
  • 从Ice到Kubernetes容器技术,微服务架构经历了什么?

    本文主要讲解了从第一代微服务架构,到以springcloud为代表的第二代微服务架构,再到k8s为代表的容器技术服务架构的演进过程。

    用户5166556
  • hadoop搭建好后出现的format异常

    14/07/10 18:50:47 FATAL conf.Configuration: error parsing conf...

    用户5166556
  • 小程序报错数据传输长度为 xxx 已经超过最大长度 xxx

     这个错误通常在通过base64给images赋值时发生,setData()微信设置的一次最大传输长度为1M,所有如果编码后的base64字符串长度超过了1M就...

    用户2038589
  • 5行代码,快速实现图像分割,代码逐行详解,手把手教你处理图像 | 开源

    图像分割,作为计算机视觉的基础,是图像理解的重要组成部分,也是图像处理的难点之一。

    量子位
  • 使用Python/scikit-image实现图像分割

    曾今看过The Terminator的人肯定会同意这是那个时代最伟大的科幻电影。在电影中,詹姆斯卡梅隆推出了一个有趣的视觉效果概念,让观众可以看到被称为终结者的...

    AI研习社
  • 米斯特白帽培训讲义(v2)实战篇 余闻同学录

    http://download.csdn.net/download/u012513463/9701150

    ApacheCN_飞龙
  • 干货|深度学习实现零件的缺陷检测

    本文由Oliver Cui根据实战经验,撰稿而成,同时他也是「视觉IMAX」知识星球特邀嘉宾。

    计算机视觉
  • 使用ngrok开启本地https服务用于测试

    lilugirl
  • SpringBoot实用小知识之Maven中dependencys和dependencymanagement区别

      利用pom管理引用包时,如果是单项目的话就直接在dependencies引用了,若有一个大工程项目里面包含多个子模块,则为了所有项目模块包的版本统一和好管理...

    欢醉

扫码关注云+社区

领取腾讯云代金券