热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:尴尬的事情又发生Newtonsoft.JsonvsProtobuf.net

篇首语:本文由编程笔记#小编为大家整理,主要介绍了尴尬的事情又发生Newtonsoft.JsonvsProtobuf.net相关的知识,希望对你有一定的参考价值。写程

篇首语:本文由编程笔记#小编为大家整理,主要介绍了尴尬的事情又发生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 100 -n 10000000 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 100 connection(s)
10000000 / 10000000 [==========================================] 100.00% 1m16s
Done!
Statistics Avg Stdev Max
Reqs/sec 131290.96 14813.10 146691.93
Latency 757.08us 1.13ms 398.02ms
HTTP codes:
1xx - 0, 2xx - 10000000, 3xx - 0, 4xx - 0, 5xx - 0
others - 0
Throughput: 118.21MB/s

技术分享图片


protobuf.net



技术分享图片

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

技术分享图片

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


高配置下测试

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


获取3个客户信息


JSON



技术分享图片

G:>bombardier.exe -c 100 -n 10000000 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 100 connection(s)
10000000 / 10000000 [============================================] 100.00% 36s
Done!
Statistics Avg Stdev Max
Reqs/sec 271738.73 67774.12 329181.89
Latency 361.86us 4.37ms 3.06s
HTTP codes:
1xx - 0, 2xx - 10000000, 3xx - 0, 4xx - 0, 5xx - 0
others - 0
Throughput: 244.72MB/s

技术分享图片


Protobuf



技术分享图片

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

技术分享图片


获取10个客户信息


JSON



技术分享图片

G:>bombardier.exe -c 100 -n 10000000 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 100 connection(s)
10000000 / 10000000 [============================================] 100.00% 51s
Done!
Statistics Avg Stdev Max
Reqs/sec 196290.74 66381.50 263699.22
Latency 502.81us 4.00ms 3.05s
HTTP codes:
1xx - 0, 2xx - 10000000, 3xx - 0, 4xx - 0, 5xx - 0
others - 0
Throughput: 513.10MB/s

技术分享图片


Protobuf



技术分享图片

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

技术分享图片


获取20个客户信息


JSON



技术分享图片

G:>bombardier.exe -c 100 -n 10000000 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 100 connection(s)
10000000 / 10000000 [============================================] 100.00% 54s
Done!
Statistics Avg Stdev Max
Reqs/sec 182806.15 37623.75 209487.43
Latency 541.37us 1.48ms 0.90s
HTTP codes:
1xx - 0, 2xx - 10000000, 3xx - 0, 4xx - 0, 5xx - 0
others - 0
Throughput: 0.89GB/s

技术分享图片


Protobuf



技术分享图片

G:>bombardier.exe -c 100 -n 10000000 http://192.168.2.19:8080/customers_protobu
f/20
Bombarding http://192.168.2.19:8080/customers_protobuf/20 with 10000000 request(
s) using 100 connection(s)
10000000 / 10000000 [==========================================] 100.00% 1m50s
Done!
Statistics Avg Stdev Max
Reqs/sec 90249.67 9611.23 102294.37
Latency 1.10ms 1.04ms 518.03ms
HTTP codes:
1xx - 0, 2xx - 10000000, 3xx - 0, 4xx - 0, 5xx - 0
others - 0
Throughput: 246.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/codesenberg/bombardier

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


推荐阅读
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 关于CMS收集器的知识介绍和优缺点分析
    本文介绍了CMS收集器的概念、运行过程和优缺点,并解释了垃圾回收器的作用和实践。CMS收集器是一种基于标记-清除算法的垃圾回收器,适用于互联网站和B/S系统等对响应速度和停顿时间有较高要求的应用。同时,还提供了其他垃圾回收器的参考资料。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
author-avatar
郑越与焕柳的88_679
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有