设为首页 加入收藏

TOP

开源 , KoobooJson一款高性能且轻量的JSON框架(一)
2019-09-17 18:46:37 】 浏览:104
Tags:开源 KoobooJson 高性能 轻量 JSON 框架

KoobooJson - 更小更快的C# JSON序列化工具(基于表达式树构建)

 

  在C#领域,有很多成熟的开源JSON框架,其中最著名且使用最多的是 Newtonsoft.Json ,然而因为版本迭代,其代码要兼容从net2.0到现在的最新的net框架,并且要支持.net平台下的其它语言,所以最新发布版本的Newtonsoft.Json其dll大小接近700k,另一方面,因为其复杂的迭代历史导致它的代码为了维护向下扩展性和向上兼容性而舍弃一些性能。

  如果你不太在乎体积和性能的话,那么 Newtonsoft.Json 无疑是一款很好的选择。但是如果你在意性能的话,在github上仍然有一些出名的以速度为称的c# JSON框架,其中最为人知的应该是 JIL , JIL有着出色的性能是因为它采用了大量的加速技术,但这也带来了一些局限性,它不够灵活,对object类型的解析必须得调用它的另一个API,并且因为出于性能考虑其采用的是Emit技术,不易维护,在我的测试中有很多类型它不支持。但是JIL的地位是显而易见的,因为它的出现,github上有着很多相仿思路的以速度为称的JSON框架,几乎每个都称自己是最快的,但实际上很少有超越JIL的,并且它们中的大部分没有一个良好的文档,这导致我在做性能测试时,我想改个配置都得对源码全局搜索花费一定时间。

  在说回程序集大小,JIL的最新发布版本是500k,并且其依赖一个库,加起来是800k大小。

  那么,我讲这些,大家应该知道我想要表达什么!

  是的,考虑到前面种种,这些都不是在某种场景最理想化的那种JSON库,所以我写了一款以体积更小,速度更快,类型覆盖更广的开源C# JSON框架,它叫:KoobooJson

在我正式介绍KoobooJson之前,我要介绍一下什么是Kooboo

Kooboo是我们老板用C#编写的一个开源的非常神奇的网站开发工具,它是一个类CMS生成器,但其从数据库,前端引擎,到各种网络协议服务器都是用c#自主创造的,几乎很少使用到第三方库,它编译后的发布版本仅有几M,而正是因为仅仅只有几M,为了Json框架不要太影响主程序的大小,这才有了KoobooJson此次的诞生!

Kooboo是开源的:https://github.com/Kooboo/Kooboo

KoobooJson自然也是开源的:https://github.com/Kooboo/Json

在NuGet包中可以直接搜索 KoobooJson 下载使用即可

什么是KoobooJson?

  KoobooJson是一款C#的JSON工具,其主要通过表达式技术构建,最低支持.NET4.5(可以支持.NET4.0,但考虑到一些因素,最终没有支持,有需要支持的可以自行源码分支更改。另外,几乎每个以性能号称的JSON框架都最低支持.NET4.5),最低支持.NET Core 2.0,体积小巧,性能出色,类型覆盖广是KoobooJson的优点!

KoobooJson的优点

1. 小巧

目前KoobooJson只有130k, 并且没有任何额外依赖项, KoobooJson当前支持框架版本.NET4.5 .NET Core2+ .NET Standard 2

2. 快速

KoobooJson 遵循JSON RFC8259规范, 是一款适用于C#的快速的Json文本序列化器

它基于表达式树构建, 在运行时会动态的为每个类型生成高效的解析代码, 这过程包括: 利用静态泛型模板进行缓存, 避免字典查询开销, 避免装箱拆箱消耗, 缓冲池复用, 加速字节复制...

KoobooJson生成代码的方式并没有采用Emit, 而是采用ExpressionTree. ExpressionTree相比Emit而言, 它不能像Emit直接写出最优的IL代码, 它依赖于下层的编译器, 在某些时候它会多生成一些不必要的IL代码路径, 故而性能上有所逊色. 但相较于几乎没有类型检查的Emit而言, ExpressionTree不会出现各种莫名其妙的错误, 它更加安全, 也更加容易扩展维护.

虽然ExpressionTree与Emit相比在性能方面可能会有所差异, 但是KoobooJson的表现却相当亮眼!

 

上图是使用BenchmarkDotNet在Net Core2.1上做的Json序列化和反序列化的性能测试,随机生成大量的测试数据,迭代100次后产生的结果,基准报告在这里

BenchmarkDotNet=v0.11.4, OS=Windows 10.0.17763.316 (1809/October2018Update/Redstone5) Intel Core i7-8550U CPU 1.80GHz (Kaby Lake R), 1 CPU, 8 logical and 4 physical cores .NET Core SDK=2.1.505 [Host] : .NET Core 2.1.9 (CoreCLR 4.6.27414.06, CoreFX 4.6.27415.01), 64bit RyuJIT Job-XEQPPS : .NET Core 2.1.9 (CoreCLR 4.6.27414.06, CoreFX 4.6.27415.01), 64bit RyuJIT

IterationCount=100 LaunchCount=1 WarmupCount=1

3. 覆盖类型广

在类型定义上, KoobooJson并没有单独实现每个集合或键值对类型, 而是对这些FCL类型进行划分成不同的模板

a. KoobooJson将序列化分为5种类型:

  • 原始类型
    它包括 Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double, and Single.

  • 所有拥有键值对行为的类型
    任何能够实现IDictionary<>或能够实现IDictionary且能够通过构造函数注入键值对的类型, 都将以键值对方式进行解析

  • 所有拥有集合行为的类型
    任何能够实现IEnumable并且满足IColloction的Add行为或拥有自己独特的集合行为且能够通过构造函数注入集合的类型, 都将以集合方式进行解析

  • 特殊类型
    如Nullable<>, Lazy<>, Guid, Datatable, DateTime, Type, Task, Thread, Timespan...等等这些特定的类型实现

  • 常规Model的键值对类型
    在KoobooJson中, 如果当类型不满足上述4种时, 将会以键值对的形式来对其解析, KoobooJson会对Model中公开的所有元素进行序列化, 在这个环节, 几乎配置器中所有的配置都是有

首页 上一页 1 2 3 4 5 下一页 尾页 1/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇《C#并发编程经典实例》学习笔记.. 下一篇c#中缓存的使用

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目