写程序做下性能测试都是例行的事情了,一般在普通电脑上测试一下如果比较理想那基本不出什么意外!但世事难料,代码写得不好经常担心CPU不够用,其实写得好但不能完全发挥出CPU资源的优势更是一件悲剧的事情!这次事件已经发生了两回,其实还真的很折磨人的。话不多说回到今天的正题Newtonsoft.Json vs Protobuf.net,对于两者的性能我相信大部分人会站在Protobuf.net这一边,的确Protobuf.net作为进制序列化比JSON文本的序列化要高效也是正常事情;但总会有些情况让人难以预料的!接下来看一下测试情况

低置下测试

测试硬件:配置是E3-1230V2 测试用例:返回指定数据量的客户列表信息

Newtonsoft.Json

D:\>bombardier.exe -c  -n  http://192.168.2.18:8080/customers_json/3
Bombarding http://192.168.2.18:8080/customers_json/3 with 10000000 request(s) us
ing connection(s)
/ [==========================================] 100.00% 1m16s
Done!
Statistics Avg Stdev Max
Reqs/sec 131290.96 14813.10 146691.93
Latency .08us .13ms .02ms
HTTP codes:
1xx - , 2xx - , 3xx - , 4xx - , 5xx -
others -
Throughput: .21MB/s

protobuf.net

D:\>bombardier.exe -c  -n  http://192.168.2.18:8080/customers_protobu
f/
Bombarding http://192.168.2.18:8080/customers_protobuf/3 with 10000000 request(s
) using connection(s)
/ [===========================================] 100.00% 1m5s
Done!
Statistics Avg Stdev Max
Reqs/sec 152160.79 14677.95 163191.02
Latency .08us .10ms .02ms
HTTP codes:
1xx - , 2xx - , 3xx - , 4xx - , 5xx -
others -
Throughput: .35MB/s

由于数据都是字符类型的字段,所以Protobuf.net在性能上并没占有多大的优势,不过的确可以节省大量的带宽,大概能节少40%的带宽资源。其实从测试结果看来JSON处理也并没有想像中那么慢,性能差距在20-30%之间,其实还是可以接受的。

高配置下测试

既然在低配置的机器上Protobuf.net有优势,那高配置的服务器按理也不会存在什么问题。但测试结果告诉我们,Protobuf.net输给了Newtonsoft.Json! 测试硬件:配置是E5-2670V2*2 测试用例:返回指定数据量的客户列表信息

获取3个客户信息

JSON

G:\>bombardier.exe -c  -n  http://192.168.2.19:8080/customers_json/3
Bombarding http://192.168.2.19:8080/customers_json/3 with 10000000 request(s) us
ing connection(s)
/ [============================================] 100.00% 36s
Done!
Statistics Avg Stdev Max
Reqs/sec 271738.73 67774.12 329181.89
Latency .86us .37ms .06s
HTTP codes:
1xx - , 2xx - , 3xx - , 4xx - , 5xx -
others -
Throughput: .72MB/s

Protobuf

G:\>bombardier.exe -c  -n  http://192.168.2.19:8080/customers_protobu
f/
Bombarding http://192.168.2.19:8080/customers_protobuf/3 with 10000000 request(s
) using connection(s)
/ [============================================] 100.00% 41s
Done!
Statistics Avg Stdev Max
Reqs/sec 243710.66 28345.63 275334.86
Latency .47us .25us .02ms
HTTP codes:
1xx - , 2xx - , 3xx - , 4xx - , 5xx -
others -
Throughput: .26MB/s

获取10个客户信息

JSON

G:\>bombardier.exe -c  -n  http://192.168.2.19:8080/customers_json/10

Bombarding http://192.168.2.19:8080/customers_json/10 with 10000000 request(s) u
sing connection(s)
/ [============================================] 100.00% 51s
Done!
Statistics Avg Stdev Max
Reqs/sec 196290.74 66381.50 263699.22
Latency .81us .00ms .05s
HTTP codes:
1xx - , 2xx - , 3xx - , 4xx - , 5xx -
others -
Throughput: .10MB/s

Protobuf

G:\>bombardier.exe -c  -n  http://192.168.2.19:8080/customers_protobu
f/
Bombarding http://192.168.2.19:8080/customers_protobuf/10 with 10000000 request(
s) using connection(s)
/ [==========================================] 100.00% 1m14s
Done!
Statistics Avg Stdev Max
Reqs/sec 135254.64 24971.37 165490.90
Latency .06us .24ms .03ms
HTTP codes:
1xx - , 2xx - , 3xx - , 4xx - , 5xx -
others -
Throughput: .84MB/s

获取20个客户信息

JSON

G:\>bombardier.exe -c  -n  http://192.168.2.19:8080/customers_json/20

Bombarding http://192.168.2.19:8080/customers_json/20 with 10000000 request(s) u
sing connection(s)
/ [============================================] 100.00% 54s
Done!
Statistics Avg Stdev Max
Reqs/sec 182806.15 37623.75 209487.43
Latency .37us .48ms .90s
HTTP codes:
1xx - , 2xx - , 3xx - , 4xx - , 5xx -
others -
Throughput: .89GB/s

Protobuf

G:\>bombardier.exe -c  -n  http://192.168.2.19:8080/customers_protobu
f/
Bombarding http://192.168.2.19:8080/customers_protobuf/20 with 10000000 request(
s) using connection(s)
/ [==========================================] 100.00% 1m50s
Done!
Statistics Avg Stdev Max
Reqs/sec 90249.67 9611.23 102294.37
Latency .10ms .04ms .03ms
HTTP codes:
1xx - , 2xx - , 3xx - , 4xx - , 5xx -
others -
Throughput: .07MB/s

随着返回的列表数据越大,Protobuf.net的响应延时就越高,但服务器的CPU资源占用率比较低。而Newtonsoft.Json虽然损耗了大量的CPU资源,但它能通过CPU资源可以有效地把并发数量提升起来;当在获取20个客户信息的时候,基本把10Gb的带宽占满并达到180000RPS。Protobuf.net在CPU资源占用率上来说虽然比'Newtonsoft.Json'要低很多,但面对一个悲剧的事情就是无法把RPS提升上去,在最后的测试结果里落后了Newtonsoft.Json一倍的RPS.

总结

随着硬件资源大规模化,在测试程序的时候也要考虑这情况,程序无法在高配置资源完全发挥硬件资源的优势这种情况针对我个人而言已经是第二次了,这种事情刚开始真让人感觉到相当无助,因为这真的很难让人接受的事实!其实出现这情况都是程序的某个功能点在多线程并发上出现了拥挤的情况,第一次出现这情况是.net core的ServerGC设置,而这一次看了Protobuf.Net的代码发现有些关键方法静态方法上出现的多对象锁的代码,可能是这些锁导致在更多线程资源使用的时候无法达到一个更好的并发效果。最后在这里提醒一下测试的朋友,程序的性能很重要,但有一点也很重要的就是完全发挥所有硬件资源处理更多的事情。

如果感兴趣这个测试的代码,可以通过以下地址获取:https://github.com/IKende/FastHttpApi/blob/master/WebApi_json_vs_protobuf.zip

尴尬的事情又发生Newtonsoft.Json vs Protobuf.net的更多相关文章

  1. VS2013新建MVC5项目,使用nuget更新项目引用后发生Newtonsoft.Json引用冲突的解决办法

    错误信息如下: 错误    3    类型“Newtonsoft.Json.JsonPropertyAttribute”同时存在于“c:\Program Files (x86)\Microsoft V ...

  2. 基于 Vue.js 之 iView UI 框架非工程化实践记要 使用 Newtonsoft.Json 操作 JSON 字符串 基于.net core实现项目自动编译、并生成nuget包 webpack + vue 在dev和production模式下的小小区别 这样入门asp.net core 之 静态文件 这样入门asp.net core,如何

    基于 Vue.js 之 iView UI 框架非工程化实践记要   像我们平日里做惯了 Java 或者 .NET 这种后端程序员,对于前端的认识还常常停留在 jQuery 时代,包括其插件在需要时就引 ...

  3. .NET Core 3.0 System.Text.Json 和 Newtonsoft.Json 行为不一致问题及解决办法

    行为不一致 .NET Core 3.0 新出了个内置的 JSON 库, 全名叫做尼古拉斯 System.Text.Json - 性能更高占用内存更少这都不是事... 对我来说, 很多或大或小的项目能少 ...

  4. Newtonsoft.Json 版本冲突解决

    在做asp.net MVC 开发时,因为引用的dll 中使用了更高版本的 Newtonsoft.Json ,导致运行时发生错误, 查资料说是因为webApi使用了Newtonsoft.Json 导致了 ...

  5. Newtonsoft.Json动态过滤属性

    Newtonsoft.Json动态过滤属性 接口写的多了,会发现很多的问题.同一个dto,不同的action返回的字段个数不一样.往往开发人员因为懒或者各种原因一股脑的全返回,会浪费很多流量且用户体验 ...

  6. 第三节:框架前期准备篇之利用Newtonsoft.Json改造MVC默认的JsonResult

    一. 背景 在MVC框架中,我们可能经常会用到 return Json(),而Json方法内部又是一个JsonResult类,那么JsonResult内部又是什么原理呢?在MVC框架中,各种xxxRe ...

  7. Newtonsoft.Json 你必须知道的一些用法

    最近在做接口开发,对方团队开发了一个Web API 的接口,传输数据的格式是 JSON.当时看到这个东西,感觉很简单,也没想什么,没用多久就完成了我的功能,我完成的功能很简单,就是获取数据,然后把数据 ...

  8. Newtonsoft.Json 的高级用法

    Ø  简介 接着前一篇http://www.cnblogs.com/abeam/p/8295765.html,继续研究 Newtonsoft.Json 的一些高级用法.主要包括: 1.   JSON ...

  9. 未能加载文件或程序集“Newtonsoft.Json”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)

    "/"应用程序中的服务器错误. 未能加载文件或程序集"Newtonsoft.Json"或它的某一个依赖项.找到的程序集清单定义与程序集引用不匹配. (异常来自 ...

随机推荐

  1. fasthttp中的协程池实现

    fasthttp中的协程池实现 协程池可以控制并行度,复用协程.fasthttp 比 net/http 效率高很多倍的重要原因,就是利用了协程池.实现并不复杂,我们可以参考他的设计,写出高性能的应用. ...

  2. 面试必问!Java 多线程中两个线程交替执行,一个输出偶数,一个输出奇数

    前言 楼主今天在面经上看到这个题,挺有意思,小小的题目对多线程的考量还挺多.大部分同学都会使用 synchronized 来实现.楼主今天带来另外两种优化实现,让你面试的时候,傲视群雄! 第一种 sy ...

  3. css中固定宽高div与不固定宽高div垂直居中的处理办法

    固定高宽div垂直居中 如上图,固定高宽的很简单,写法如下: position: absolute; left: 50%; top: 50%; width:200px; height:100px; m ...

  4. hystrix 请求合并(6)

    hystrix支持N个请求自动合并为一个请求,这个功能在有网络交互的场景下尤其有用,比如每个请求都要网络访问远程资源,如果把请求合并为一个,将使多次网络交互变成一次,极大节省开销.重要一点,两个请求能 ...

  5. Ubuntu18.04(linux)安装MySQL

    安装 mysql sudo apt-get --purge remove mysql-server mysql-common mysql-client sudo apt-get install mys ...

  6. C# - 如何让类型可以比较

    IComparable<T> .NET 里,IComparable<T>是用来作比较的最常用接口. 如果某个类型的实例需要与该类型的其它实例进行比较或者排序的话,那么该类型就可 ...

  7. 再谈腾讯云centos服务器不能登录的解决过程

    上篇文章谈到腾讯云centos服务器不能登录,通过查看监控信息,cpu使用过高,再腾讯云页面使用VNC方式直接登录,然后根据提示信息,关闭导致内存溢出的进程,从而解决问题. 1 问题再现 昨天刚解决了 ...

  8. java~springboot~目录索引

    回到占占推荐博客索引 最近写了不过关于java,spring,微服务的相关文章,今天把它整理一下,方便大家学习与参考. java~springboot~目录索引 Java~关于开发工具和包包 Java ...

  9. EF的应用

    EF是 EntityFramework 的简称.在程序和数据库交互的过程中,起到了极大的方便. EF的使用 首先在需要使用EF的项目单击,然后 Ctrl+Shift+a 找到ADO.NET实体数据模型 ...

  10. DevExpress控件安装破解和汉化使用教程

    这段时间因公司业务需要.net开发且需要用到DevExpress控件,我自己研究学习了一下,用的是visual studio(2013)和DevExpress(V14.1.4),VS2013的下载安装 ...