前言:

CYQ.Data 版本更新的这么多年,中间过程的版本都在完善各种功能。

基于需要支持或兼容的代码越多,很多时候,常规思维,都把相关功能完成,就结束了。

实现过程中,无法避免的会用到大量的反射、锁等对性能有所影响的逻辑代码。

CYQ.Data 从V5.9 版本开始,开始大规模的优化调整代码,目前稳定在 V5.9.2.7 版本,下面看一下更新记录

版本更新记录:

794:新增:FireBird 数据库支持:增删改查与分页。(2023-12-18)【V5.9.0.0 - V5.9.0.2】
795:新增:DaMeng 达梦数据库支持:增删改查与分页。(2023-12-20)
796:优化:FireBird 数据结构获取与转化的精准化。(2023-12-21)
797:优化:DaMeng 数据结构获取与转化的精准化。(2023-12-22)
798:新增:DaMeng : AppConfig.DB.IsDaMengUpper 配置,默认表名字段转大写。(2023-12-23)
799:新增:FireBird:AppConfig.DB.IsFireBirdUpper 配置,默认表名字段转大写。(2023-12-23)
800:优化:Postgre: AppConfig.DB.IsPostgreLower 配置,默认表名字段转小写。(2023-12-23)
801:新增:KingBaseES 人大金仓数据库支持:增删改查与分页。(2023-12-24)
802:优化:KingBaseES 数据结构获取与转化的精准化。(2023-12-25)
803:优化:CYQ.Data.Orm.SimpleOrm 基类。(2024-01-01)
804:新增:分布式锁类:DistributedLock。(2024-01-02)
805:优化:调整注意:CacheManage 名称变更分布式缓存:DistributedCache。(2024-01-04)
806:优化:调整注意:JsonHelper 名称空间由CYQ.Data.Tool 变更为:CYQ.Data.Json。(2024-01-04)
807:优化:增加输出标准库:.net standard2.1 版本。(2024-01-10)
-------------------------------------------------------------------------------------
808:优化:AppConfig.WebRootPath 路径的获取。(2024-01-13)【V5.9.0.3】
809:优化:SimpleOrmBase(2024-01-13)
810:优化:增加 AppConfig.IsDebugMode 只读属性,优化 WebRootPath 属性取值。
811:优化:内部IP获取。
-------------------------------------------------------------------------------------
812:修复:AppConfig.IsDebugMode .net 下取值。(2024-01-21)【V5.9.0.4】
813:新增:分布式锁增加幂等性方法。(2024-01-21)
814:修复:V5.9.0.3优化的内部IP获取,在Docker容器不支持的异常。 【V5.9.0.5】
-------------------------------------------------------------------------------------
815:优化:XHtmlAction 加载 html 速度,无实体&xxxx;内容时不加载dtd。(2024-01-25)【V5.9.0.6】
816:优化:AppConfig:IsNetCore 和 IsWeb 和 WebRoot 三个属性取值。(2024-01-25)
817:移除:【分布式锁】转移到 Taurus.DistributedLock 插件库中(增加数据库锁)。(2024-01-25)
818:优化:SimpleOrmBase 增加构造函数重载,允许异常时不写日志【以支持分布式数据库锁】。(2024-01-26)
819:优化:AppConfig 调整几个不常用的配置项【DefaultCacheTime、IsEnumToInt、JsonEscape】。(2024-01-26)
820:优化:DistributedCache 开放几个批量接口,以供分布式锁插件调用。(2024-01-27)
821:修复:SimpleOrmBase 构造函数忘了赋值链接。(2024-01-29)【V5.9.0.7】
-------------------------------------------------------------------------------------
822:优化:XHtmlAction 加载性能:优化缓存转化,提升2次访问速度。(2024-01-31)【V5.9.1.0】
823:优化:XHtmlAction 加载性能:优化取消DTD依赖、提升首次访问速度。(2024-02-01)
-------------------------------------------------------------------------------------
824:优化:XHtmlAction 调整方法或属性:SaveToCache 更名为RefleshCache 等。(2024-02-04)【V5.9.1.1】
825:移除:IField 扩展。(2024-02-04)
826:优化:MDataRow GetIndex,提升取值性能。(2024-02-04)
827:优化:ConvertTool 相关方法,提升转化性能。(2024-02-04)
-------------------------------------------------------------------------------------
版本简要:通过大范围使用 Emit 来替换反射,提升性能。
828:新增:CYQ.Data.Emit(内部)优化反射代码,提升性能。【V5.9.2】
829:新增:JsonOp 参数,调整(JsonHelper、MDataRow、MDataTable)ToJson 重载方法参数。(2024-02-06)
830:优化:JsonHelper 实体转化性能:涉及:ToJson(),ToList<T>()。(2024-02-05、2024-02-22)
831:优化:MDataTable 实体列表转化性能:涉及:CreateFrom。(2024-02-22)
832:优化:MDataRow 实体转化性能:涉及:CreateFrom。。(2024-02-22)
-------------------------------------------------------------------------------------
版本简要:对 XHtmlAction 进行各种简化和优化,以供 Taurus.Mvc 便于使用。
833:移除:XHtmlAction SetFor 系列方法(该方法使用门槛较高) 。(2024-02-23)【V5.9.2.1】
834:移除:XHtmlAction SetForeach(MDataTable dataSource, string idOrName, SetType setType) 重载方法 。(2024-02-23)
835:移除:XHtmlAction GetByID,GetByName 两个方法,其 Get 方法已可替代以上两者。(2024-02-23)
836:移除:XHtmlAction IsCurrentLang,IsUseLangSplit 两个成员属性。(2024-02-23)
837:移除:XHtmlBase LoadFromCache、SetCDATA、ClearCDATA 等方法。
838:优化:XHtmlAction SetForeach 方法优化,支持绑定其它数据源。(2024-02-23)
839:优化:XHtmlAction LoadData 方法优化,效果变更为批量对KeyValue赋值。(2024-02-23)
840:优化:XHtmlAction 加载:去除 http://www.w3.org/1999/xhtml 名称空间。2024-02-24)【V5.9.2.2】
-------------------------------------------------------------------------------------
版本简要:持续优化,提升性能。
840:优化:ConvertTool、ReflectTool 相关方法。(2024-02-26)【V5.9.2.3】
841:优化:MDataRow Load(json)。(2024-02-26)
842:优化:MDataTable ToList(t) 内部方法。(2024-02-26)
845:优化:JsonHelper(2024-02-27)
-------------------------------------------------------------------------------------
846:变更:将 AppConfig 中的一些和配置无关的只读属性转移到AppConst中。(2024-02-29)【V5.9.2.4】
847:移除:LocalEnvironment 内部类。(2024-02-29)
848:优化:ConvertTool.ChangeReaderToList<T> 内部类。(2024-02-29)
849:新增:开放:CYQ.Data.Emit.EmitPreheat 类,允许处理 Emit 委托预热。(2024-02-29)
-------------------------------------------------------------------------------------
版本简要:针对 Taurus.MVC 进行全方位细节进行性能优化。【V5.9.2.6】
850:新增:HttpRequest 扩展方法:GetHeader、GetForm、GetQuery、GetCookie 等。(2024-03-04)
851:优化:XHtmlAction OutXml 等多项细节优化。(2024-03-05)
-------------------------------------------------------------------------------------
852:新增 HttpPostedFileCreator.Create 用于创建 HttpPostedFile 实例。(因 Taurus RpcProxy 添加)(2024-03-07)【V5.9.2.7】
853:新增:开放几个和实体转换相关的 Emit 接口。(2024-03-08)
854:修正:JsonHelper.ToJson 未处理 IgnoreJson 属性标记的问题、其它优化。(2024-03-08)

优化简介:

在整个优化过程,主要分为:

1、逻辑优化:

通过逻辑优化,减少代码执行。

2、减少中间商:

在过往版本,MDataTable 和 MDataRow 做为中间人,承载着所有类型转换。

通过编写直接转换,不再通过中间人进行转换,减少转换的环节。

3、Emit 代替反射:

在类型转换中,无可避免的大量的使用了反射。

为了替代大量的反射,因此编写了大量的Emit,导致工作量有点大,但为了性能,这无可避免。

4、减少锁:

在内部中,有大量用到MDicationary来缓存数据,这是一个自定义实现的线程安全的带锁的字典,曾经优化过一次,将通用锁拆分成了读写锁。

在减少锁的过程中,对于无需要 Remove 操作或 Foreach 遍历的全局数据缓存字典,将 MDicationary 换成 Dicationary,避开锁机制,对并发场景下引发的 Add 异常进行 try。

5、并行执行:

对于数据量大的场景,分拆成多线程并行执行。

下面就来重新看一下新的测试结果:

测试环境:

本次测试为.Net Windown 版本,下次再测试.Net Core Linux 版本。

Win11 系统:6核16G内存

测试代码,基础实体类:

public class SimpleEntity
{
public int ID { get; set; }
public Guid MsgID { get; set; }
public string Name { get; set; }
public bool IsEnable { get; set; }
public DateTime CreateTime { get; set; }
}

本次测试结果仅供参考

性能测试对比:

1、实体类转Json(执行4次):

2、实体类列表(100条)转Json(执行4次):

3、Json 转 Dictionary<,> (执行4次)

4、Json 转 实体类(执行4次)

5、Json 转 实体类列表100条数据 (执行4次)

测试结果总结:

1、在首次执行时,CYQ.Data 全面超过了 Newtonsoft.Json,差距明显,说明 Newtonsoft.Json 首次执行,性能较低,在预热这一块没有优化好。

2、在 Json 转 Dictionary 方面,CYQ.Data 有全面的优势,超过 Newtonsoft.Json。

2、在其它转换的在后续执行中,Newtonsoft.Json 和 CYQ.Data 差距不大,基本持平。

总结:

曾经有人和我说过,CYQ.Data 在 Json 这一块的转换性能不强,后来换了 Newtonsoft.Json 去操作 Json 。

那时候可能时机不成熟,要优化,需要重写的代码太多了,所以就没怎么处理。

直到今年,有个老田同学他自己写框架了,问了个他框架调用异步方法无法 try 到异常的问题:

秋天您好,请教您一个问题,您在做框架的时候是如何实现async的异常捕捉和处理的,我这里支持async的方法后反射到controller里的方法无法正常捕捉到异常,抛出自定义异常会让整个线程挂掉。

后来这问题解决了之后,我翻了下历史聊天记录,发现它曾经建议我在Taurus里把方法的反射换成委托。

从这里开始,开启了 Taurus.MVC 框架的全面优化。

然后就涉及做为底层组件的 CYQ.Data,将它进行了全面的性能优化大整改。

于是便有了如今性能优越的版本。

CYQ.Data 操作 Json 性能测试:对比 Newtonsoft.Json的更多相关文章

  1. [.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类

    [.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类 本节导读: 关于JSON序列化,不能 ...

  2. Newtonsoft.Json高级用法DataContractJsonSerializer,JavaScriptSerializer 和 Json.NET即Newtonsoft.Json datatable,dataset,modle,序列化

    原文地址:https://www.cnblogs.com/yanweidie/p/4605212.html Newtonsoft.Json介绍 在做开发的时候,很多数据交换都是以json格式传输的.而 ...

  3. c#操作json数据使用newtonsoft.json

    开源项目提供的一个读取示例 using System; using System.Collections.Generic; using System.IO; using System.Linq; us ...

  4. 使用JSON.Net(Newtonsoft.Json)作为ASP.Net MVC的json序列化和反序列化工具

    ASP.Net MVC默认的JSON序列化使用的是微软自己的JavaScriptSerializer.性能低不说,最让人受不了的是Dictionary<,>和Hashtable类型居然对应 ...

  5. C#将对象转换成JSON字符串,Newtonsoft.Json (JSON.NET)

    官方API说明文档 http://www.newtonsoft.com/json/help/html/N_Newtonsoft_Json.htm http://www.newtonsoft.com/ ...

  6. Newtonsoft.Json 操作 JSON 字符串

    Newtonsoft.Json介绍 在做开发的时候,很多数据交换都是以json格式传输的.而使用Json的时候,我们很多时候会涉及到几个序列化对象的使用:DataContractJsonSeriali ...

  7. ASP.NET2.0 Newtonsoft.Json 操作类分享

    JSON 是现在比较流行的数据交互格式,NET3.0+有自带类处理JSON,2.0的话需要借助Newtonsoft.Json来完成,不然自己写的话,很麻烦. 网上搜索下载 Newtonsoft.Jso ...

  8. 【转】C#解析Json Newtonsoft.Json

    Newtonsoft.Json源码 Newtonsoft.Json介绍 在做开发的时候,很多数据交换都是以json格式传输的.而使用Json的时候,我们很多时候会涉及到几个序列化对象的使用:DataC ...

  9. Newtonsoft.Json高级用法(转)

    手机端应用讲究速度快,体验好.刚好手头上的一个项目服务端接口有性能问题,需要进行优化.在接口多次修改中,实体添加了很多字段用于中间计算或者存储,然后最终用Newtonsoft.Json进行序列化返回数 ...

  10. 【转】 Newtonsoft.Json高级用法

    手机端应用讲究速度快,体验好.刚好手头上的一个项目服务端接口有性能问题,需要进行优化.在接口多次修改中,实体添加了很多字段用于中间计算或者存储,然后最终用Newtonsoft.Json进行序列化返回数 ...

随机推荐

  1. CentOS7的udev的绑定规则

    客户一套RAC环境是华为的存储,共享盘是/dev/sd*,咋一看还怀疑是没有进行多路径配置,实际和主机工程师是已经配置好的,我们使用upadmin show vlun命令可以查看到: [root@xx ...

  2. .NET 云原生架构师训练营(模块二 基础巩固 路由与终结点)--学习笔记

    2.3.3 Web API -- 路由与终结点 路由模板 约定路由 特性路由 路由冲突 终结点 ASP.NET Core 中的路由:https://docs.microsoft.com/zh-cn/a ...

  3. Java-生成字符串的MD5值

    方法一:public static String getMd5(String str) { MessageDigest md5 = null; try { md5 = MessageDigest.ge ...

  4. 鹏程杯子2023 pwn

    主要就是修改stdin的最后几位,使他变为write,然后泄露libc,为所欲为即可. 本人是卡在不知道stdin那里可以修改. 然后使用一下jmp qword rbp这个gadget 0x400a9 ...

  5. SP21690 POWERUP - Power the Power Up 题解

    题目传送门 前置知识 扩展欧拉定理 解法 直接对 \(a\) 和 \(b^c\) 分讨,跑一遍扩展欧拉定理就行了. 另外由于本题的特殊规定 \(0^0=1\),故需要在当 \(a=0\) 时,对 \( ...

  6. 【若归】 【LGR-142-Div.4】洛谷入门赛 #13赛后反思

    比赛链接:[LGR-142-Div.4]洛谷入门赛 #13 rk288,比前几次差(可能是因为rated?) A 十年OI一场空,不开long long见祖宗 #include<bits/std ...

  7. JS leetcode 两数之和 II - 输入有序数组 题解分析

    壹 ❀ 引 我在JS leetcode 两数之和 解答思路分析一文中首次解决两数之和等于目标值的问题,那么今天遇到的是两数之和的升级版,题目为leetcode167. 两数之和 II - 输入有序数组 ...

  8. NC17315 背包

    题目链接 题目 题目描述 Applese有 \(1\) 个容量为 \(v\) 的背包,有 \(n\) 个物品,每一个物品有一个价值 \(a_i\) ,以及一个大小 \(b_i\) 然后他对此提出了自己 ...

  9. js常用知识点整理

    说明:以下内容都是我工作中实际碰到的js知识点. 后面还会碰到其他知识点或对原来解决方案的改进,都会在本篇中持续不断的维护,希望给刚参加工作或初学的朋友一些参考. 1.给元素添加事件 $(" ...

  10. 启动MySQL5.7服务无法启动或Table 'mysql.plugin' doesn't exist

    首先说一下我这个是mysql5.7.16免安装版,不过这个问题对于5.7版本应该都适用. 问题重现: 安装过程也说一下吧: 1.将下载的压缩文件解压到指定目录,     我的是:E:\program\ ...