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转换组件的性能有兴趣,我先放 ...
随机推荐
- Pycharm2017常用快捷键
Pycharm 的快捷键可以在[文件]-[设置]中自定义(见上图). 下方是根据网上资料整理的官方默认快捷键设置. 常用快捷键 Ctrl + / 行注释/取消行注释 Tab / Shift + Tab ...
- SQLserver 还原数据库报“指定转换无效”的错的解决方案
最近在附加一个数据库的时候遇到一个问题:“指定转换无效”,经过分析,出现这个问题的原因可能是:1.版本不对.2.文件加密.3.文件损坏 解决方法: 一.版本不对: 1. 首先确定源数据库版本,下面 ...
- Linux 查看本机串口方法
最近在了解嵌入式方面的知识,就随笔记录一下: 查看Linux本机串口: 1.查看串口是否可用 可以对串口发送数据比如对com1口,echo /dev/ttyS02.查看串口名称使用 ls -l /de ...
- python装饰器的实现
说起装饰器我们可能已经很熟悉了(不了解的可以查看python基础学习——装饰器),随手就可以写一个简单的装饰器 def decorator(func): def inner(*args, **kwar ...
- Jmeter参数化方法
用Jmeter测试时包含两种情况的参数:一种是在url中,一种是请求中需要发送的参数. 设置参数值的方法有如下几种: 一.函数助手 用Jmeter中的函数获取参数值,__Random,__thread ...
- 关于无限试用JetBrains产品的方案
JetBrains免费试用期限为30天,通过对其试用机制的设想,找到了其破解试用机制的方案,具体如下: 在选择试用JetBrains产品的时候,它会在 C:\Users\用户名\对应产品\config ...
- java基础-温故而知新(02)
基本数据的自动拆装箱及享元设计模式 1.1 自动装箱 -128~127 之间的整数,装在一个内存区域. 超过这个范围的整数,装在不同的内存区域. 1.2 自动拆箱 ...
- nginx limit_rate突然限速失败
##问题 nginx限制用户对指定目录的访问: <!-- lang: shell --> location ~ ^/(path001)/ { limit_rate 0k; limit_co ...
- 个人技术博客Alpha----Android Studio学习
项目联系: 本次项目我主要负责Android studio的后端,以及游戏文案游戏策划,结果后来事情太散了,Android studio学的不咋地,文案写完还有帮着写一写数据库的插入语句,然后就是跟队 ...
- JAVA获取本机IP和Mac地址
在项目中,时常需要获取本机的Ip或是Mac地址,进行身份和权限验证,本文就是通过java代码获取ip和Mac. package com.svse.query;import java.net.In ...