尴尬的事情又发生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中位运算
1byte(字节)=8bit(比特) 1 0 0 0 0 0 0 0 1 2进制的1的原码 反码 补码 0 0 0 0 0 0 0 0 2进制的0的原码 反码 补码 -1 1 0 0 0 0 ...
- Maven项目中,系统设置的CLASSPATH环境变量问题
在Maven项目中,系统的CLASSPATH环境变量失效了吗?在用Maven开发登录网站时,servlet-api出现错误,jdbc也出现错误,都是ClassNotFoundException,但这两 ...
- uoj123 【NOI2013】小Q的修炼
搞了一下午+半晚上.其实不是很难. 提答题重要的是要发现数据的特殊性质,然后根据不同数据写出不同的算法获得其对应的分数. 首先前两个测试点我们发现可以直接暴搜通过,事实上对于每个数据都暴搜加上一定的次 ...
- 【建模+强连通分量】POJ1904 King's Quest
Description 一个国王有n个王子,同时有n个女孩.每个王子都有自己喜欢的若干个女孩,现给定一个合法的完备匹配(也就是一个王子娶其中一个自己喜欢女孩),求每个王子可以选择哪些女孩可以让剩下的每 ...
- BZOJ_2631_tree_LCT
BZOJ_2631_tree_LCT Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上 ...
- postman-----使用CSV和Json文件实现批量接口测试
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px ".PingFang SC"; color: #454545 } span ...
- 用python把一个txt文件中所有逗号,替换成空格?
string = "word 2 3 4 5 6 7" string = ",".join(string.split()) import numpy as np ...
- 简述RPC原理实现
前言 架构的改变,往往是因为业务规模的扩张. 随着业务规模的扩张,为了满足业务对技术的要求,技术架构需要从单体应用架构升级到分布式服务架构,来降低公司的技术成本,更好的适应业务的发展. 分布式服务 ...
- 10位时间戳使用moment转化为日期
前情提要: 需要把后台传过来的10位时间戳转化格式为:‘YYYY-MM-DD HH:mm:ss’的日期展示在页面上.本来是自己写了个函数,但是奈何leader说我们项目用了moment了,你为什么不用 ...
- Oracle执行计划学习笔记
目录 一.获取执行计划的方法 (1) explain plan for (2) set autotrace on (3) statistics_level=all (4) dbms_xplan.dis ...