尴尬的事情又发生Newtonsoft.Json vs Protobuf.net
写程序做下性能测试都是例行的事情了,一般在普通电脑上测试一下如果比较理想那基本不出什么意外!但世事难料,代码写得不好经常担心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的更多相关文章
- VS2013新建MVC5项目,使用nuget更新项目引用后发生Newtonsoft.Json引用冲突的解决办法
错误信息如下: 错误 3 类型“Newtonsoft.Json.JsonPropertyAttribute”同时存在于“c:\Program Files (x86)\Microsoft V ...
- 基于 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 时代,包括其插件在需要时就引 ...
- .NET Core 3.0 System.Text.Json 和 Newtonsoft.Json 行为不一致问题及解决办法
行为不一致 .NET Core 3.0 新出了个内置的 JSON 库, 全名叫做尼古拉斯 System.Text.Json - 性能更高占用内存更少这都不是事... 对我来说, 很多或大或小的项目能少 ...
- Newtonsoft.Json 版本冲突解决
在做asp.net MVC 开发时,因为引用的dll 中使用了更高版本的 Newtonsoft.Json ,导致运行时发生错误, 查资料说是因为webApi使用了Newtonsoft.Json 导致了 ...
- Newtonsoft.Json动态过滤属性
Newtonsoft.Json动态过滤属性 接口写的多了,会发现很多的问题.同一个dto,不同的action返回的字段个数不一样.往往开发人员因为懒或者各种原因一股脑的全返回,会浪费很多流量且用户体验 ...
- 第三节:框架前期准备篇之利用Newtonsoft.Json改造MVC默认的JsonResult
一. 背景 在MVC框架中,我们可能经常会用到 return Json(),而Json方法内部又是一个JsonResult类,那么JsonResult内部又是什么原理呢?在MVC框架中,各种xxxRe ...
- Newtonsoft.Json 你必须知道的一些用法
最近在做接口开发,对方团队开发了一个Web API 的接口,传输数据的格式是 JSON.当时看到这个东西,感觉很简单,也没想什么,没用多久就完成了我的功能,我完成的功能很简单,就是获取数据,然后把数据 ...
- Newtonsoft.Json 的高级用法
Ø 简介 接着前一篇http://www.cnblogs.com/abeam/p/8295765.html,继续研究 Newtonsoft.Json 的一些高级用法.主要包括: 1. JSON ...
- 未能加载文件或程序集“Newtonsoft.Json”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
"/"应用程序中的服务器错误. 未能加载文件或程序集"Newtonsoft.Json"或它的某一个依赖项.找到的程序集清单定义与程序集引用不匹配. (异常来自 ...
随机推荐
- Java 保留两位小数填坑
下面直接上代码: DecimalFormat df1 = new DecimalFormat("#.00");DecimalFormat df2 = new DecimalForm ...
- index_levedb.go
) binary.BigEndian.PutUint64(key, fid) return l.db.Delete(key, nil) } //关闭资源 func (l *LevelD ...
- Guava新增集合类型-Bimap
Guava新增集合类型-Bimap BiMap提供了一种新的集合类型,它提供了key和value的双向关联的数据结构. 通常情况下,我们在使用Java的Map时,往往是通过key来查找value的,但 ...
- 【bzoj 2326】【HNOI 2011】数学作业
题解: 矩阵裸体. #include<cstdio> #include<cstring> #include<cmath> typedef long long ll; ...
- TiDB show processlist命令源码分析
背景 因为丰巢自去年年底开始在推送平台上尝试了TiDB,最近又要将承接丰巢所有交易的支付平台切到TiDB上.我本人一直没有抽出时间对TiDB的源码进行学习,最近准备开始一系列的学习和分享.由于我本人没 ...
- 【转】超酷的 mip-infinitescroll 无限滚动(无限下拉)
写在前面 无限滚动技术(又叫做无限下拉技术)被广泛应用于新闻类,图片预览类网站.对用户来讲,使用无限滚动的页面有源源不断的信息可以预览,增加用户在页面的停留时长.技术上原理也很简单,在页面加载时加载一 ...
- Bootstrap优秀模板-INSPINIA.2.9.2
下载量最高的Bootstrap管理端模板,完美适配H5,.NET COre.MVC5.Ruby on Rails多种开发环境. 下面是官方介绍:INSPINIA Admin Theme is a pr ...
- java常用的框架介绍
一.SpringMVC http://blog.csdn.net/evankaka/article/details/45501811 Spring Web MVC是一种基于Java的实现了Web MV ...
- C语言sprintf和sscanf函数用法
以前刚用C语言的时候,觉得字符串很难处理,后来用多了,发现其实并非如此,C语言也提供了许多函数给程序员使用.今天记录一下两个常用的两个字符串处理函数:sprintf和sscanf 1. sprintf ...
- 从壹开始前后端分离 41 || Nginx+Github+PM2 快速部署项目(一)
前言 哈喽大家周一好!今天是农历腊月二十三,小年开始,恭祝大家新年快乐(哈哈你五福了么