近期有个性能调优工作。通过dottrace 分析,发现几处问题,其中json.net 在序列化和反序列化的时候也比较耗性能,所以考虑能不能通过其它序列化方式来提高性能。

1 object 序列化代码

    public class ObjectConvert
{
/// <summary>
/// 将一个object对象序列化,返回一个byte[]
/// </summary>
/// <param name="obj">能序列化的对象</param>
/// <returns></returns>
public static byte[] ObjectToBytes(object obj)
{
using (MemoryStream ms = new MemoryStream())
{
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, obj); return ms.GetBuffer();
}
} /// <summary>
/// 将一个序列化后的byte[]数组还原
/// </summary>
/// <param name="Bytes"></param>
/// <returns></returns>
public static object BytesToObject(byte[] Bytes)
{
using (MemoryStream ms = new MemoryStream(Bytes))
{
IFormatter formatter = new BinaryFormatter();
return formatter.Deserialize(ms);
}
}
}

2 Test 方法,用了 老赵写的codetimer

    [TestClass]
public class SerializeTestor
{
private List<UserInfo> InitData(int count)
{
UserInfo user = null;
List<UserInfo> users = new List<UserInfo>(); for (int i = 0; i < count; i++)
{
user = new UserInfo();
user.Age = new Random().Next(10, 100);
user.Name = "yuan";
user.CreateTime = DateTime.Now;
users.Add(user);
} return users;
}
private List<UserInfo> InitBigStringData(int count)
{
UserInfo user = null;
List<UserInfo> users = new List<UserInfo>(); for (int i = 0; i < count; i++)
{
user = new UserInfo();
user.Age = new Random().Next(10, 100);
//user.Name = "yuan";
user.Name = "yudddddddddddddddddddddddddddyudddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddanyudddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddanyudddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddanyudddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddanddddddddddddddddddddddddddddddddddddddddddddddddddan";
user.CreateTime = DateTime.Now;
users.Add(user);
} return users;
} [TestMethod]
public void Serialize_十万次_Test()
{
var users = InitData(100000);
// object序列化
CodeTimer.Time("object序列化", 1, () =>
{
var temps = ObjectConvert.ObjectToBytes(users);
});
// newtonsoft.json
CodeTimer.Time("json.net序列化", 1, () =>
{
var temps = JsonConvert.SerializeObject(users);
});
} [TestMethod]
public void Serialize_百万次_Test()
{
var users = InitData(1000000);
// object序列化
CodeTimer.Time("object序列化", 1, () =>
{
var temps = ObjectConvert.ObjectToBytes(users);
});
// newtonsoft.json
CodeTimer.Time("json.net序列化", 1, () =>
{
var temps = JsonConvert.SerializeObject(users);
});
}
[TestMethod]
public void SerializeBigString_十万次_Test()
{
var users = InitBigStringData(100000);
// object序列化
CodeTimer.Time("object序列化", 1, () =>
{
var temps = ObjectConvert.ObjectToBytes(users);
});
// newtonsoft.json
CodeTimer.Time("json.net序列化", 1, () =>
{
var temps = JsonConvert.SerializeObject(users);
});
}
[TestMethod]
public void SerializeBigString_百万次_Test()
{
var users = InitBigStringData(1000000);
// object序列化
CodeTimer.Time("object序列化", 1, () =>
{
var temps = ObjectConvert.ObjectToBytes(users);
});
// newtonsoft.json
CodeTimer.Time("json.net序列化", 1, () =>
{
var temps = JsonConvert.SerializeObject(users);
});
}
}

  

3 测试结果:

Serialize_十万次_Test:
object序列化
Time Elapsed: 188ms
Time Elapsed (one time):188ms
CPU time: 187,500,000ns
CPU time (one time): 187,500,000ns
Gen 0: 1
Gen 1: 0
Gen 2: 0 json.net序列化
Time Elapsed: 138ms
Time Elapsed (one time):138ms
CPU time: 140,625,000ns
CPU time (one time): 140,625,000ns
Gen 0: 3
Gen 1: 1
Gen 2: 0 ================================================
Serialize_百万次_Test
object序列化
Time Elapsed: 2,073ms
Time Elapsed (one time):2,073ms
CPU time: 2,078,125,000ns
CPU time (one time): 2,078,125,000ns
Gen 0: 23
Gen 1: 1
Gen 2: 0 json.net序列化
Time Elapsed: 1,449ms
Time Elapsed (one time):1,449ms
CPU time: 1,437,500,000ns
CPU time (one time): 1,437,500,000ns
Gen 0: 28
Gen 1: 27
Gen 2: 0 ===================================================
SerializeBigString_十万次_Test
object序列化
Time Elapsed: 187ms
Time Elapsed (one time):187ms
CPU time: 187,500,000ns
CPU time (one time): 187,500,000ns
Gen 0: 3
Gen 1: 2
Gen 2: 2 json.net序列化
Time Elapsed: 339ms
Time Elapsed (one time):339ms
CPU time: 328,125,000ns
CPU time (one time): 328,125,000ns
Gen 0: 19
Gen 1: 14
Gen 2: 3 ======================================================
SerializeBigString_百万次_Test
object序列化
Time Elapsed: 2,099ms
Time Elapsed (one time):2,099ms
CPU time: 2,046,875,000ns
CPU time (one time): 2,046,875,000ns
Gen 0: 26
Gen 1: 25
Gen 2: 3 json.net序列化
System.OutOfMemoryException: 引发类型为“System.OutOfMemoryException”的异常。

  

4 结论:

JSON.NET 在小对象处理时,性能比BinaryFormatter好

JSON.NET 比 BinaryFormatter  耗内存

JSON.NET  GC中带回收的对象会比较影响整体性能

JSON.NET VS BinaryFormatter 性能的更多相关文章

  1. es分布式文档系统_bulk api的奇特json格式与底层性能优化关系

    1.bulk api奇特的json格式{"action":{"meta"}}\n{"data"}\n{"action": ...

  2. 基于.NET CORE微服务框架 -surging 基于messagepack、protobuffer、json.net 性能对比

    1.前言 surging内部使用的是高性能RPC远程服务调用,如果用json.net序列化肯定性能上达不到最优,所以后面扩展了protobuf,messagepack序列化组件,以支持RPC二进制传输 ...

  3. Java几种常用JSON库性能比较

    本篇通过JMH来测试一下Java中几种常见的JSON解析库的性能. 每次都在网上看到别人说什么某某库性能是如何如何的好,碾压其他的库.但是百闻不如一见,只有自己亲手测试过的才是最值得相信的. JSON ...

  4. Protobuf有没有比JSON快5倍?用代码来击破pb性能神话

    转 http://www.sohu.com/a/136487507_505779 2017-04-26 07:58 程序设计 /58 /技术 导读:Google 的 Protocol Buffers ...

  5. Java常用的几个Json库,性能强势对比!

    作者:飞污熊 https://xncoding.com/2018/01/09/java/jsons.html 本篇通过JMH来测试一下Java中几种常见的JSON解析库的性能.每次都在网上看到别人说什 ...

  6. json系列(三)cjson,rapidjson,yyjson解析性能对比

    前言 本篇对cjson,rapidjson,yyjson三种json反序列化工具的性能进行对比. 有json样本数据如下: 实验环境: cpu:Xeon cpu主频:2.20GHz 以下示例均未对字段 ...

  7. SQL Server 2016 JSON原生支持实例说明

    背景 Microsoft SQL Server 对于数据平台的开发者来说越来越友好.比如已经原生支持XML很多年了,在这个趋势下,如今也能在SQLServer2016中使用内置的JSON.尤其对于一些 ...

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

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

  9. 几个常用Json组件的性能测试

    上一篇文章中我已经介绍了JsonBuilder方案的整体思路以及一个版本的雏形代码,他现在已经是可以使用的了,但是因为是实时反射的,所以效率并不高. 鉴于几位博友对Json转换组件的性能有兴趣,我先放 ...

随机推荐

  1. 测试中Android与IOS分别关注的点

    主要从本身系统的不同点.系统造成的不同点.和注意的测试点做总结 1.自身不同点 研发商:Adroid是google公司做的手机系统,IOS是苹果公司做的手机系统 开源程度:Android是开源的,IO ...

  2. Python基础知识:集合

    1.集合(set)是一个存放在中括号内的无序,不重复的序列.例如:set = {'1','12','25'} 2.创建集合的两种方法: set = {1,2,3} 中括号直接创建 set = {[1, ...

  3. <20190104>关掉一些鸡肋的Win10功能

    讨厌鬼001 # - windows defender -    本身没什么卵用, 却一直占着位置, 而且不断提示更新. 必须关闭它 . 在"运行" 中,  输入 "gp ...

  4. 转载 JavaScript的函数声明与函数表达式的区别

    1)函数声明(Function Declaration); // 函数声明 function funDeclaration(type){ return type==="Declaration ...

  5. hadoop学习笔记壹 --环境搭建及配置文件的修改

    Hadoop生态和其他生态最大的不同之一就是“单一平台多种应用”的理念了. hadoop能解决是什么问题: 1.HDFS :海量数据存储 MapReduce: 海量数据分析   YARN :资源管理调 ...

  6. Spring Security 用户认证原理分析

    本文基于 spring-security-core-5.1.1 和 tomcat-embed-core-9.0.12. 核心原理 用户通过 username 和 password 登录时,后端会经过一 ...

  7. rosdep update 超时

    https://blog.csdn.net/azhuty/article/details/41209957 http://www.cnblogs.com/wangyarui/p/6059688.htm ...

  8. Objective-C 符号化

    符号化,顾名思义,就是把地址翻译成人能看懂的符号以及它们在文件中的位置,符号包括函数名和变量名等等. 1.什么地方有符号? 1)App Mach-O格式的二进制文件 2)DWARF(Debugging ...

  9. ubuntu 用remastersys 备份系统并且安装

    sudo add-apt-repository ppa:mutse-young/remastersys 2.更新系统软件源 sudo apt-get update 3.更新完了,先安装remaster ...

  10. java 面向对象基本概念

    1.面向对象与面向过程 (1).都是解决问题的思维方式,都是代码组织的方式. (2).解决简单问题可以使用面向过程 (3).解决复杂问题:宏观上使用面向对象把握,微观处理上仍然是面向过程. 2.面向对 ...