序列化和反序列化.NET Core与Go Data

嗨%用户名%


我的任务是比较.NET Core和Golang的序列化性能。 搜索互联网后,我遇到了一个存储库 。 考虑一个REST微服务的简单示例。 我想这正是我所需要的。 看到测试结果后,我很惊讶。 查看源代码后,我意识到出了什么问题。 这是我不喜欢的:


  • 对于序列化和反序列化,选择了3个元素的数组。 显然这还不够。
  • 对于Golang,未使用该语言的所有功能,但是,正如您所知,encoding / json内置库很慢。
  • 结果,作者比较了红est和net / http Web服务器的性能。

这些缺点导致在上述示例的框架中更详细地考虑了性能。 我希望您发现了解结果有趣。


软件的组成和说明


上面存储库中的源代码也被当作基础。 已经完成的工作:


  • 对于服务器API,使用fasthttp
  • API服务器以记录数组作为响应。
  • 每个客户端都有几种检查方法。

修改后的代码在存储库中可用。


为了清楚起见,来自服务器API的示例JSON响应:


[ { "Id":"id_8299119732867115081", "Name":"name_5541535679032008745", "Time":1566731141 }, ... { "Id":"id_2804604318195309547", "Name":"name_5914011395631118540", "Time":1566731142 } ] 

客户群


为了评估每种服务的性能,实现了三种方法:


  • 从服务器API接收数据并发送而不处理[/ testNoProcess]。
  • 从服务器API接收数据-反序列化,使用反射进行序列化并发送[/ testReflection]。 对于.NETCore,使用Newtonsoft.Json包,对于Golang,使用encoding / json。
  • 从服务器API接收数据-反序列化,序列化而不使用反射并发送[/ testNoReflection]。 对于.NETCore,实现了基于Span的解决方案以最大程度地减少内存分配的数量。 Golang有一个现成的解决方案-easyjson库,它已经在积极方面证明了自己。

根据这些测试,您可以评估Web服务器(kestrel和net / http)的相对性能,使用反射处理数据时的性能下降,而对于使用两种语言的实现,如果没有反射,则性能下降。


测试方法说明


测试分多个阶段进行,以评估每种语言和每种实现的性能。
为了创建负载,选择了bombardier实用程序。 该实用程序使用以下参数启动:-c 125 -d 120s,其解释如下:如何使用125个线程的测试时间为120秒。


绩效评估分三个阶段进行:


  1. RPS API服务器尺寸。 进行测量是为了能够评估处理方法对每种方法性能的影响。
  2. 使用反射对响应处理进行RPS测量。
  3. 在不使用反射的情况下测量RPS响应处理。

基于这些测量,获得了响应处理性能的数据。 所有处理器内核的利用率为99.8-100%。 为了进行评估,选择了10、30、100和500个记录的初始数据。 生产中包含500条记录的数组并不常见,但是我很想知道每种语言的行为。


试验台


所有测试均在运行Ubuntu Server 18.04的虚拟机上运行,​​并于2019年8月进行了所有更新。 具有以下特点:


  • 处理器核心I7-3770K-4核心。
  • 内存-4 GB。

为了进行性能比较,安装了.NET Core 2.2和Golang 1.12。


好了,现在该着手最有趣的结果了。


结果


下表是测试结果表。


alt text


您会立即注意到Golang具有更高效率的Web服务器。 与.NET Core中的Kestrel相比,该差异约为12%。
根据上面的数据,构建了2个图。 接下来,您可以清楚地看到RPS的比较。


alt text


由于net / http库的速度更快,因此Golang对于小数据显示出了良好的效果。 随着数据量的增加,性能可与茶est相比。


在小数据量上使用反射时,考虑到测量误差,RPS大约相同。 随着数据量的增加,.NET Core显示出更多的RPS。


在不使用反射的情况下进行测试时,两种语言均显示出性能提升。 Golang表现出更好的性能,因为它最初在未经处理的测试中具有更高的RPS(每秒请求数)。 在小数据上,优势非常明显。 随着数据量的增加,RPS​​几乎被比较了。 在对500条记录的最大测试中,Golang再次领先。


alt text


在使用反射的测试中,Golang在所有方面都失败了。 最坏情况下的性能下降超过60%。 开箱即用地实现序列化以提高性能通常是毫无用处的。
没有反射,Golang在所有测试中都更快。 随着数据的增长,Golang的优势只会越来越大。 在任何情况下,拒绝使用反射都会大大提高Golang和.NETCore的性能,这通常是可以预期的。


结论


从这种小的性能比较中可以得出什么结论? 我想以每种解决方案的利弊形式来表述。 让我们从Golang开始:


  • 它具有更好的性能,并且可以进一步改进,例如,通过使用fasthttp作为Web服务器。
  • 由于代码生成-无需使用反射即可方便地使用处理方法。
  • 减少内存消耗。

.NET Core还具有以下优点:


  • 性能适合大多数情况。
  • 我认为,这是Visual Studio最好,最方便的开发环境之一。

结果可以总结如下:如果您具有REST API,并且您计划的负载很大而不是太复杂的业务逻辑,则最好使用Golang,在其他情况下,可以使用.NET Core。 我应该将现成的解决方案从.NET Core重写为Golang吗? 每个人都会自己决定。


我希望您发现此材料有用。 一切都很好

Source: https://habr.com/ru/post/zh-CN469271/


All Articles