写程序做下性能测试都是例行的事情了,一般在普通电脑上测试一下如果比较理想那基本不出什么意外!但世事难料,代码写得不好经常担心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. ts基础(1)

    // let num:number = 12; // let boo:boolean = true; // let str:string = "adfd"; // str = 'a ...

  2. python之算法排序模块

    这是一个能够随时学习重要算法的Python模块,记录在案,方便查看 特点 易于使用 容易理解的文档 快速获取算法的源代码 随时获取时间复杂度 安装 仅需在终端中执行以下命令: pip3 install ...

  3. [Active Learning] Multi-Criteria-based Active Learning

    目录 1 Informativeness 2 Representativeness 3 Diversity 3.1 Global consideration 3.2 Local considerati ...

  4. 了解Scala反射

    本篇文章主要让大家理解什么是Scala的反射, 以及反射的分类, 反射的一些术语概念和一些简单的反射例子. 什么是反射 我们知道, Scala是基于JVM的语言, Scala编译器会将Scala代码编 ...

  5. Javaoop 遇到的问题

    一.java 异常的捕获与处理 (免责声明:本博客里所引用的他人博客链接,只用作我个人的学习,同时非常感谢这些作者!) 1.  https://blog.csdn.net/wei_zhi/articl ...

  6. 【Java】几道常见的秋招面试题

    前言 只有光头才能变强 Redis目前还在看,今天来分享一下我在秋招看过(遇到)的一些面试题(相对比较常见的) 0.final关键字 简要说一下final关键字,final可以用来修饰什么? 这题我是 ...

  7. 金三银四,如何征服面试官,拿到Offer

    又到了茶余饭后的时间,想想写点什么,掐指一算,噢呦,快到3月份了,职场的金三银四跳槽季又来了,不同的是今年比往年「冷」一些,形式更加严峻一些,大家多多少少可能都听到或看到一些信息,就是好多公司在优化裁 ...

  8. 基于flexbox纯css框架的解析

    学CSS很好的一个方法大概是先用纯CSS来实现一个自己的框架,然后便可以在之后的使用中对一开始可能很粗糙的框架做细致的优化与改进,删除些冗余,添加些功能之类的. 当然,为了避免一开始写框架时候的时候手 ...

  9. HTML 练习显示隐藏

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. GeoServer中sld文件的获取来源

    众所周知,uDig是GeoServer的一个客户端,可以方便地可视化配置样式. QGIS行不行呢? 当然可以,双击图层名称,弹出图层属性对话框 在符号化(style)标签页选择样式导出即可. 参考博客 ...