JSON.NET VS BinaryFormatter 性能
近期有个性能调优工作。通过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 性能的更多相关文章
- es分布式文档系统_bulk api的奇特json格式与底层性能优化关系
1.bulk api奇特的json格式{"action":{"meta"}}\n{"data"}\n{"action": ...
- 基于.NET CORE微服务框架 -surging 基于messagepack、protobuffer、json.net 性能对比
1.前言 surging内部使用的是高性能RPC远程服务调用,如果用json.net序列化肯定性能上达不到最优,所以后面扩展了protobuf,messagepack序列化组件,以支持RPC二进制传输 ...
- Java几种常用JSON库性能比较
本篇通过JMH来测试一下Java中几种常见的JSON解析库的性能. 每次都在网上看到别人说什么某某库性能是如何如何的好,碾压其他的库.但是百闻不如一见,只有自己亲手测试过的才是最值得相信的. JSON ...
- Protobuf有没有比JSON快5倍?用代码来击破pb性能神话
转 http://www.sohu.com/a/136487507_505779 2017-04-26 07:58 程序设计 /58 /技术 导读:Google 的 Protocol Buffers ...
- Java常用的几个Json库,性能强势对比!
作者:飞污熊 https://xncoding.com/2018/01/09/java/jsons.html 本篇通过JMH来测试一下Java中几种常见的JSON解析库的性能.每次都在网上看到别人说什 ...
- json系列(三)cjson,rapidjson,yyjson解析性能对比
前言 本篇对cjson,rapidjson,yyjson三种json反序列化工具的性能进行对比. 有json样本数据如下: 实验环境: cpu:Xeon cpu主频:2.20GHz 以下示例均未对字段 ...
- SQL Server 2016 JSON原生支持实例说明
背景 Microsoft SQL Server 对于数据平台的开发者来说越来越友好.比如已经原生支持XML很多年了,在这个趋势下,如今也能在SQLServer2016中使用内置的JSON.尤其对于一些 ...
- [.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类
[.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类 本节导读: 关于JSON序列化,不能 ...
- 几个常用Json组件的性能测试
上一篇文章中我已经介绍了JsonBuilder方案的整体思路以及一个版本的雏形代码,他现在已经是可以使用的了,但是因为是实时反射的,所以效率并不高. 鉴于几位博友对Json转换组件的性能有兴趣,我先放 ...
随机推荐
- redis慢查询日志的配置和查看
Redis是单线程运行的,一个慢执行,会让后续的大量执行延时,吞吐量也会极大的降低.记录.查询.监控Redis慢执行意义重大.Redis的slowlog只记录在内存中,效率很高,不用过于担心影响性能. ...
- D-Link DIR-600 - Authentication Bypass
#Exploit Title: D-Link DIR-600 - Authentication Bypass (Absolute Path Traversal Attack) # CVE - http ...
- January 08th, 2018 Week 02nd Monday
To be yourself in a world that is constantly trying to make you something else is the greatest accom ...
- 17秋 软件工程 团队第五次作业 Alpha Scrum1
题目:团队作业--Alpha冲刺 17秋 软件工程 团队第五次作业 Alpha Scrum1 各个成员在 Alpha 阶段认领的任务 伟航:督促和监督团队进度,协调组内合作 港晨:APP前端页面编写: ...
- SAP CRM 开发学习资料和教程整理【不定时更新】
本文链接:http://www.cnblogs.com/hhelibeb/p/6276929.html 首先是SAP网站上面的相关内容 SAP Customer Relationship Manage ...
- Java设计模式之九 ----- 解释器模式和迭代器模式
前言 在上一篇中我们学习了行为型模式的责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern).本篇则来学习下行为型模式的两个模式, 解 ...
- 无根树的计数——prufer序列
参考博客https://www.cnblogs.com/dirge/p/5503289.html (1)prufer数列是一种无根树的编码表示,类似于hash. 一棵n个节点带编号的无根树,对应唯一串 ...
- Problem UVA12657-Boxes in a Line(数组模拟双链表)
Problem UVA12657-Boxes in a Line Accept: 725 Submit: 9255 Time Limit: 1000 mSec Problem Description ...
- 用PHP的curl实现并发请求远程文件(并发抓取远程网页)
PHP的curl功能确实强大了.里面有个curl_multi_init功能,就是批量处理任务.可以利用此,实现多进程同步抓取多条记录,优化普通的网页抓取程序. 一个简单的抓取函数: function ...
- WebSocket原理与实践(三)--解析数据帧
WebSocket原理与实践(三)--解析数据帧 1-1 理解数据帧的含义: 在WebSocket协议中,数据是通过帧序列来传输的.为了数据安全原因,客户端必须掩码(mask)它发送到服务器的所有 ...