【Android Protobuf 序列化】Protobuf 性能测试 ( fastjson 序列化与反序列化 | gson 序列化与反序列化 | 三种序列化与反序列化性能对比 )(一)

本文涉及的产品
性能测试 PTS,5000VUM额度
简介: 【Android Protobuf 序列化】Protobuf 性能测试 ( fastjson 序列化与反序列化 | gson 序列化与反序列化 | 三种序列化与反序列化性能对比 )(一)

文章目录

一、导入依赖库

二、构造 JavaBean

三、fastjson 序列化与反序列化

四、gson 序列化与反序列化

五、完整代码

1、主界面代码

2、JSON 测试代码

3、执行结果

六、参考资料





一、导入依赖库


在上一篇博客 【Android Protobuf 序列化】Protobuf 使用 ( Protobuf 源码分析 | 创建 Protobuf 对象 ) 中 , 创建了 Protobuf 对象 , 本博客中将其序列化 , 保存到本地文件中 ;



导入 fastjson 与 gson 依赖库 , 即可使用两个 json 序列化与反序列化 API ;


 

implementation 'com.google.code.gson:gson:2.8.2'
    implementation 'com.alibaba:fastjson:1.1.67.android'





二、构造 JavaBean


参考 addressbook.proto 构造 JavaBean ,


// 指定 Protocol Buffers 语法版本
syntax = "proto2";
package tutorial;
option java_multiple_files = true;
// 生成 Java 源文件包名
option java_package = "com.example.tutorial.protos";
// 生成 Java 源文件类名
option java_outer_classname = "AddressBookProtos";
// message 相当于 Java 中的 class
// 编译出的源文件就是 class Person{}
message Person {
  // String 类型的字段
  // 字段前有 optional 和 required 修饰
  optional string name = 1;
  // int 整型 , 32 位
  optional int32 id = 2;
  optional string email = 3;
  // 枚举
  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }
  message PhoneNumber {
    optional string number = 1;
    // 字段值是枚举类型, 默认是 HOME 类型
    optional PhoneType type = 2 [default = HOME];
  }
  // 表示重复的数据 , 即集合
  // 有多个 PhoneNumber phones 组成的集合
  repeated PhoneNumber phones = 4;
}
message AddressBook {
  repeated Person people = 1;
}


需要构造 AddressBook , Person , AddressBook 3 33 个 JavaBean , 构造结果如下 :


class PhoneNumber{
    enum class PhoneType{
        MOBILE,
        HOME,
        WORK;
    }
    var number: String = ""
    var type: PhoneType = PhoneType.MOBILE
    constructor(number: String, type: PhoneType) {
        this.number = number
        this.type = type
    }
}
class Person{
    lateinit var name: String
    var id: Int = 0
    var email: String = ""
    var phones: MutableList<PhoneNumber> = mutableListOf()
    constructor(name: String, id: Int, email: String, phones: MutableList<PhoneNumber>) {
        this.name = name
        this.id = id
        this.email = email
        this.phones = phones
    }
}
class AddressBook{
    var persons: MutableList<Person> = mutableListOf()
}






三、fastjson 序列化与反序列化


使用 fastjson 进行序列化与反序列化 :


 

// 初始化 kim.hsl.protobuf.AddressBook 对象
        var addressBook: AddressBook = AddressBook()
        addressBook.persons = mutableListOf(
            Person("Tom", 0, "", mutableListOf(PhoneNumber("666", PhoneNumber.PhoneType.MOBILE))),
            Person("Jerry", 1, "", mutableListOf(PhoneNumber("888", PhoneNumber.PhoneType.MOBILE)))
        )
        // 测试 fastjson
        var fastjsonStart = System.currentTimeMillis()
        // fastjson 序列化 : 将 addressBook 转为 json 字符串
        var jsonString: String = JSON.toJSONString(addressBook)
        // 将字符串转为 Byte 数组
        var bytes = jsonString.toByteArray()
        Log.i(
            MainActivity.TAG, "fastjson 序列化耗时 ${System.currentTimeMillis() - fastjsonStart} ms , " +
                "序列化大小 ${bytes.size} 字节")
        fastjsonStart = System.currentTimeMillis()
        // 序列化操作
        JSON.parseObject(String(bytes), com.example.tutorial.protos.AddressBook::class.java)
        Log.i(MainActivity.TAG, "fastjson 反序列化耗时 ${System.currentTimeMillis() - fastjsonStart} ms")


执行结果 :

2021-04-27 22:51:02.539 16698-16698/kim.hsl.protobuf I/MainActivity: fastjson 序列化耗时 21 ms , 序列化大小 169 字节
2021-04-27 22:51:02.568 16698-16698/kim.hsl.protobuf I/MainActivity: fastjson 反序列化耗时 29 ms






四、gson 序列化与反序列化


使用 gson 进行序列化与反序列化 :


   

// 初始化 kim.hsl.protobuf.AddressBook 对象
        var addressBook: AddressBook = AddressBook()
        addressBook.persons = mutableListOf(
            Person("Tom", 0, "", mutableListOf(PhoneNumber("666", PhoneNumber.PhoneType.MOBILE))),
            Person("Jerry", 1, "", mutableListOf(PhoneNumber("888", PhoneNumber.PhoneType.MOBILE)))
        )
        // 测试 gson
        var gsonStart = System.currentTimeMillis()
        // gson 序列化 : 将 addressBook 转为 json 字符串
        jsonString = Gson().toJson(addressBook)
        // 将字符串转为 Byte 数组
        bytes = jsonString.toByteArray()
        Log.i(
            MainActivity.TAG, "gson 序列化耗时 ${System.currentTimeMillis() - gsonStart} ms , " +
                "序列化大小 ${bytes.size} 字节")
        gsonStart = System.currentTimeMillis()
        Gson().fromJson(String(bytes), com.example.tutorial.protos.AddressBook::class.java)
        Log.i(MainActivity.TAG, "gson 反序列化耗时 ${System.currentTimeMillis() - gsonStart} ms")


执行结果 :


2021-04-27 22:51:02.597 16698-16698/kim.hsl.protobuf I/MainActivity: gson 序列化耗时 29 ms , 序列化大小 169 字节
2021-04-27 22:51:02.609 16698-16698/kim.hsl.protobuf I/MainActivity: gson 反序列化耗时 12 ms



相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
目录
打赏
0
0
0
0
39
分享
相关文章
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
38 11
使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试
使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试
66 13
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
55 10
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
156 13
浅谈网页端IM技术及相关测试方法实践(包括WebSocket性能测试)
最开始转转的客服系统体系如IM、工单以及机器人等都是使用第三方的产品。但第三方产品对于转转的业务,以及客服的效率等都产生了诸多限制,所以我们决定自研替换第三方系统。下面主要分享一下网页端IM技术及相关测试方法,我们先从了解IM系统和WebSocket开始。
68 4
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
99 1
如何在实际应用中测试和比较React和Vue的性能?
总之,通过多种方法的综合运用,可以相对客观地比较 React 和 Vue 在实际应用中的性能表现,为项目的选择和优化提供有力的依据。
63 1
Linux环境下测试服务器的DDR5内存性能
通过使用 `memtester`和 `sysbench`等工具,可以有效地测试Linux环境下服务器的DDR5内存性能。这些工具不仅可以评估内存的读写速度,还可以检测内存中的潜在问题,帮助确保系统的稳定性和性能。通过合理配置和使用这些工具,系统管理员可以深入了解服务器内存的性能状况,为系统优化提供数据支持。
112 4
再也不用心惊胆战地使用FastJSON了——序列化篇
本篇将主要介绍json序列化的详细流程。本文阅读的FastJSON源码版本为2.0.31。
710 13
php性能监测模块XHProf安装与测试
【10月更文挑战第13天】php性能监测模块XHProf安装与测试
51 0

热门文章

最新文章

  • 1
    如何修复 Android 和 Windows 不支持视频编解码器的问题?
    66
  • 2
    Android历史版本与APK文件结构
    120
  • 3
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    43
  • 4
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
    23
  • 5
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
    5
  • 6
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
    11
  • 7
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    12
  • 8
    Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
    1
  • 9
    MySQL原理简介—3.生产环境的部署压测
    20
  • 10
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    28
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等