Moshi Vs Gson Vs Kotlin Serialisation性能PK

这篇具有很好参考价值的文章主要介绍了Moshi Vs Gson Vs Kotlin Serialisation性能PK。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Moshi Vs Gson Vs Kotlin Serialisation性能PK,Kotlin进阶,kotlin,开发语言,android

Moshi Vs Gson Vs Kotlin Serialisation

定义

  • Gson

Gson 是一个Java序列化/反序列化库,用于将Java对象转换为JSON格式,以及将JSON格式转换回Java对象。

  • Moshi

Moshi 是一个现代化的JSON库,适用于Android和Java。它使得将JSON解析为Java对象以及将Java对象转换回JSON变得简单。

  • Kotlin序列化

Kotlin序列化是一种以Kotlin为主导的、在编译时类型安全、无反射且完全跨平台准备的序列化机制,用于将Kotlin对象转换为JSON或Protobuf等数据格式,反之亦然。该库不使用无反射,而是采用显式注解 @Serializable。应用该注解后,编译器插件会在伴生对象上添加一个特殊的函数 serializer(),返回类型为 KSerializer 的序列化器。KSerializer 对象实现了所需的接口,用于序列化和反序列化数据类。

性能比较

为了定义比较,创建了一个基准测试规则,可以总结如下代码片段:

class SerializableBenchMark {
    lateinit var json: Json
    lateinit var moshi: Moshi
    lateinit var gson: Gson
    lateinit var response: String
    private val context = InstrumentationRegistry.getInstrumentation().targetContext

    @Before
    fun setup() {
        json = Json {
            ignoreUnknownKeys = true
            isLenient = true
            encodeDefaults = false
            coerceInputValues = true
        }
        moshi = Moshi.Builder()
            .add(KotlinJsonAdapterFactory())
            .build()

        gson = GsonBuilder()
             .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
            .setLenient().create()

        response = context.assets.open("sample_response.json").use {
            it.bufferedReader().readText()
        }
    }
    @get:Rule
    val benchmarkRule = BenchmarkRule()

    @Test
    fun exampleKotlinSerialisation() = benchmarkRule.measureRepeated {
        json.decodeFromString(Response.serializer(), response)
    }

    @Test
    fun exampleMoshi() = benchmarkRule.measureRepeated {
        val jsonAdapter = moshi.adapter(Response::class.java)
        jsonAdapter.fromJson(response)
    }

    @Test
    fun exampleGson() = benchmarkRule.measureRepeated {
          gson.fromJson(response, Response.javaClass)
    }
}
  • 这里的 sample_response.json是从此链接构建的。

https://www.covidvisualizer.com/api

结果

测试用例 1 — 基准测试

我已记录了每个测试用例对应的 benchmark-data.json 文件,以便进行比较。

设备详情

"build": {
            "brand": "vivo",
            "device": "2130",
            "fingerprint": "vivo/2130i/2130:12/SP1A.210812.003/compiler05210733:user/release-keys",
            "model": "V2130",
            "version": {
                "sdk": 31
            }
        },
        "cpuCoreCount": 8,
        "cpuLocked": true,
        "cpuMaxFreqHz": 2500000000,
        "memTotalBytes": 12146495488,
        "sustainedPerformanceModeEnabled": false
    }

Kotlin -Serialisation

"benchmarks": [
        {
            "name": "PROFILED_exampleKotlinSerialisation",
            "params": {},
            "className": "com.example.benchmark.SerializableBenchMark",
            "totalRunTimeNs": 12119030155,
            "metrics": {
                "timeNs": {
                    "minimum": 3.802098385E9,
                    "maximum": 3.802098385E9,
                    "median": 3.802098385E9,
                    "runs": [
                        3.802098385E9
                    ]
                },
                "allocationCount": {
                    "minimum": 19390.0,
                    "maximum": 19390.0,
                    "median": 19390.0,
                    "runs": [
                        19390.0,
                        19390.0,
                        19390.0,
                        19390.0,
                        19390.0
                    ]
                }
            },
            "sampledMetrics": {},
            "warmupIterations": 2310,
            "repeatIterations": 1,
            "thermalThrottleSleepSeconds": 0
        }
    ]

Moshi

"benchmarks": [
        {
            "name": "PROFILED_exampleMoshi",
            "params": {},
            "className": "com.example.benchmark.SerializableBenchMark",
            "totalRunTimeNs": 11961625309,
            "metrics": {
                "timeNs": {
                    "minimum": 3.531992307E9,
                    "maximum": 3.531992307E9,
                    "median": 3.531992307E9,
                    "runs": [
                        3.531992307E9
                    ]
                },
                "allocationCount": {
                    "minimum": 14509.0,
                    "maximum": 16854.0,
                    "median": 14509.0,
                    "runs": [
                        16854.0,
                        14509.0,
                        14509.0,
                        14509.0,
                        14509.0
                    ]
                }
            },
            "sampledMetrics": {},
            "warmupIterations": 1202,
            "repeatIterations": 1,
            "thermalThrottleSleepSeconds": 0
        }
    ]

Gson

"benchmarks": [
        {
            "name": "PROFILED_exampleGson",
            "params": {},
            "className": "com.example.benchmark.SerializableBenchMark",
            "totalRunTimeNs": 1331248385,
            "metrics": {
                "timeNs": {
                    "minimum": 1.76971077E8,
                    "maximum": 1.76971077E8,
                    "median": 1.76971077E8,
                    "runs": [
                        1.76971077E8
                    ]
                },
                "allocationCount": {
                    "minimum": 20.0,
                    "maximum": 20.0,
                    "median": 20.0,
                    "runs": [
                        20.0,
                        20.0,
                        20.0,
                        20.0,
                        20.0
                    ]
                }
            },
            "sampledMetrics": {},
            "warmupIterations": 1062,
            "repeatIterations": 1,
            "thermalThrottleSleepSeconds": 0
        }
    ]

从上面的结果可以看出,Kotlin-serialisation 花费了 12.11 秒,Moshi 花费了 11.96 秒,而 Gson 花费了 13.31 秒。

测试用例 2 — 字段不存在

在这里,我从 US 节点中移除了 name 节点,如下截图所示。
Moshi Vs Gson Vs Kotlin Serialisation性能PK,Kotlin进阶,kotlin,开发语言,android
Kotlin-Serialisation测试截图如下
Moshi Vs Gson Vs Kotlin Serialisation性能PK,Kotlin进阶,kotlin,开发语言,android
Moshi测试截图如下
Moshi Vs Gson Vs Kotlin Serialisation性能PK,Kotlin进阶,kotlin,开发语言,android
在这种情况下,Gson 忽略了该字段并完全执行了。

对于所有这些,我们可以看到 Moshi 的错误相对于其他两者来说更具体。

测试用例 3 - 使用基准报告

单次迭代结果
Moshi Vs Gson Vs Kotlin Serialisation性能PK,Kotlin进阶,kotlin,开发语言,android
5次迭代结果
Moshi Vs Gson Vs Kotlin Serialisation性能PK,Kotlin进阶,kotlin,开发语言,android

结论

总体而言,在序列化/反序列化方面,Moshi 显示出了良好的结果,但 Kotlin 序列化具有 Protobuf 支持,可以帮助降低延迟和有效载荷大小,因此根据用途,人们可以谨慎选择所需的库。文章来源地址https://www.toymoban.com/news/detail-613749.html

到了这里,关于Moshi Vs Gson Vs Kotlin Serialisation性能PK的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 协程 VS 线程,Kotlin技术精讲

    协程(coroutines)是一种并发设计模式,您可以在Android 平台上使用它来简化异步执行的代码。协程是在版本 1.3 中添加到 Kotlin 的,它基于来自其他语言的既定概念。 在 Android 上,协程有助于管理长时间运行的任务,如果管理不当,这些任务可能会阻塞主线程并导致应用无响应。

    2024年02月09日
    浏览(37)
  • VS Code环境下配置Kotlin语言开发环境

    目录 一、安装VS Code扩展 1.安装Kotlin Language 2. 安装、配置Code Runner 二、安装Kotlin-compiler 1.下载Kotlin-compiler 2.安装JDK 3.配置环境变量 三、测试代码 安装成功后进入Code Runner扩展设置,下滑勾选Code-runner:Run In Terminal  打开Kotlin官网  Kotlin https://kotlinlang.org/  Get started打开Kotlin的官

    2024年02月09日
    浏览(54)
  • 【kotlin 协程】万字协程 一篇完成kotlin 协程进阶

    Kotlin 中的协程提供了一种全新处理并发的方式,可以在 Android 平台上使用它来简化异步执行的代码。协程是从 Kotlin 1.3 版本开始引入,但这一概念在编程世界诞生的黎明之际就有了,最早使用协程的编程语言可以追溯到 1967 年的 Simula 语言。 在过去几年间,协程这个概念发展

    2024年02月07日
    浏览(53)
  • kotlin教程4:函数进阶

    kotlin教程:编程基础💎数据结构💎面向对象 kotlin 的函数定义非常灵活,既可以按照顺序传参,也可以通过参数名传参,而且可以设置参数默认值,这些在基础教程中已经讲过了。 此外, kotlin 中用 vararg 修饰的参数,为长度可变的参数列表 递归是一种常用的编程技巧,就像

    2024年02月05日
    浏览(49)
  • Kotlin 进阶

    都是子类泛型变成父类 out是get方法,子类提升父类输出 in是set方法,子类提升父类输入 一般是委托接口和属性的  

    2024年01月18日
    浏览(38)
  • kotlin语法进阶 - 协程(一)协程基础

    协程并不是一个新的概念,而是一个非常老的概念,很多语言都支持协程,建议去浏览器去了解一下协程的历史和基本概念,这里我们只讲一下kotlin中的协程的作用。 从代码实现角度来看:kotlin协程底层是用线程实现的,是一个封装完善供开发者使用的线程框架。kotlin的一个

    2024年02月09日
    浏览(46)
  • Android开发知识学习——Kotlin进阶

    申明前缀有construct修饰 如果有一个主构造函数,每个次构造函数需要委托给主构造函数,可以直接委托或者通过别的构造函数 主构造函数:是类头的一部分,跟在类名后面(可带参数),没有任何注解和可见性修饰符。如: 主构造函数中没有任何代码,初始化代码放在关键

    2024年02月06日
    浏览(64)
  • 【28】Kotlin语法进阶——使用协程编写高效的并发程序

    提示:此文章仅作为本人记录日常学习使用,若有存在错误或者不严谨得地方欢迎指正。 协程是Kotlin语言中很有代表性的一种并发设计模式,用于简化异步执行的代码。 协程和线程有点类似,可以简单地将它理解成一种轻量级的线程 。我们前面学习的线程是属于重量级的,

    2024年02月03日
    浏览(53)
  • Spring Boot进阶(79):使用Kotlin轻松打造高效的Spring Boot应用

            随着Java开发语言的发展,很多新的编程语言不断涌现,其中Kotlin备受开发者青睐,它是一种相对新的基于JVM的静态语言,支持Java虚拟机(JVM)和Android开发。Kotlin将Java语言中的一些缺点进行了优化,并增加了很多新的特性,因此在开发效率和代码可读性上具有很

    2024年02月08日
    浏览(53)
  • 性能测试VS负载测试VS压力测试

    性能测试     性能测试的目的不是去找bugs,而是排除系统的瓶颈,以及为以后的回归测试建立一个基准。而性能测试的操作,实际上就是一个非常小心受控的测量分析过程。在理想的情况下,被测软件在这个时候已经是足够稳定了,所以这个过程得以顺利的进行。     一组

    2024年04月10日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包