PRF&PUB:20170818 Go vs .NET Core in terms of HTTP performance.md

@runningwater https://linux.cn/article-8935-1.html
This commit is contained in:
wxy 2017-10-06 11:15:49 +08:00
parent 69333643ab
commit 5ecb72816e

View File

@ -1,4 +1,4 @@
论 HTTP 性能Go 与 .NET Core 争雌雄
论 HTTP 性能Go 与 .NET Core 争雌雄
============================================================
![](https://cdn-images-1.medium.com/max/1200/1*60T60jSMO5yxUqJQmLZa4A.png)
@ -9,25 +9,25 @@
因为是新出的,我不想立马就比较两个不同的东西,所以我耐心等待,想等发布更稳定的版本后再进行。
本周一,微软[发布 .NET Core 2.0 版本][7],因此,我准备开始。您们认为呢?
本周一8 月 14 日),微软[发布 .NET Core 2.0 版本][7],因此,我准备开始。您们认为呢?
如前面所提的,我们会比较们相同的东西,比如应用程序、预期响应及运行时的稳定性,所以我们不会把像对 `JSON` 或者 `XML` 的编码、解码这些烦多的事情加入比较游戏中来,仅仅只会使用简单的文本消息。为了公平起见,我们会分别使用 Go 和 .NET Core 的[ MVC 架构模式][8]。
如前面所提的,我们会比较们相同的东西,比如应用程序、预期响应及运行时的稳定性,所以我们不会把像对 JSON 或者 XML 的编码、解码这些烦多的事情加入比较游戏中来,仅仅只会使用简单的文本消息。为了公平起见,我们会分别使用 Go 和 .NET Core 的 [MVC 架构模式][8]。
### 先决条件
### 参赛选手
[Go][9] (或者 Golang): 是一种[快速增长][10]的开源编程语言,旨在构建出简单、快捷和稳定可靠的应用软件。
[Go][9] (或称 Golang 是一种[快速增长][10]的开源编程语言,旨在构建出简单、快捷和稳定可靠的应用软件。
用于支持 Go 语言的 MVC web 框架并不多,还好我们找到了 Iris ,可胜任此工作。
[Iris][11]: 支持 Go 语言的快速、简单和高效的微型 Web 框架。它为您的下一代网站、API 或分布式应用程序奠定了精美的表现方式和易于使用的基础。
[Iris][11] 支持 Go 语言的快速、简单和高效的微型 Web 框架。它为您的下一代网站、API 或分布式应用程序奠定了精美的表现方式和易于使用的基础。
[C#][12]: 是一种通用的,面向对象的编程语言。其开发团队由 [Anders Hejlsberg][13] 领导。
[C#][12] 是一种通用的、面向对象的编程语言。其开发团队由 [Anders Hejlsberg][13] 领导。
[.NET Core][14]: 跨平台,可以在极少时间内开发出高性能的应用程序。
[.NET Core][14] 跨平台,可以在极少时间内开发出高性能的应用程序。
从 [https://golang.org/dl][15] 下载 Go ,从 [https://www.microsoft.com/net/core][16] 下载 .NET Core。
从 [https://golang.org/dl][15] 下载 Go ,从 [https://www.microsoft.com/net/core][16] 下载 .NET Core。
在下载和安装好这些软件后,还需要在 Go 端安装 Iris。安装很简单仅仅只需要打开终端然后执行如下语句
在下载和安装好这些软件后,还需要为 Go 安装 Iris。安装很简单仅仅只需要打开终端然后执行如下语句
```
go get -u github.com/kataras/iris
@ -37,31 +37,27 @@ go get -u github.com/kataras/iris
#### 硬件
* 处理器: Intel(R) Core(TM) i74710HQ CPU @ 2.50GHz 2.50GHz
* 内存: 8.00 GB
* 处理器: Intel(R) Core(TM) i74710HQ CPU @ 2.50GHz 2.50GHz
* 内存: 8.00 GB
#### 软件
* 操作系统: 微软 Windows [10.0.15063 版本], 电源计划设置为“高性能”
* HTTP 基准工具: [https://github.com/codesenberg/bombardier][1], 使用最新的 1.1 版本。
* .NET Core: [https://www.microsoft.com/net/core][2], 使用最新的 2.0 版本。
* Iris: [https://github.com/kataras/iris][3], 使用基于 [Go 1.8.3][4] 构建的新新 8.3 版本。
* 操作系统: 微软 Windows [10.0.15063 版本] 电源计划设置为“高性能”
* HTTP 基准工具: [https://github.com/codesenberg/bombardier][1] 使用最新的 1.1 版本。
* .NET Core [https://www.microsoft.com/net/core][2] 使用最新的 2.0 版本。
* Iris [https://github.com/kataras/iris][3] 使用基于 [Go 1.8.3][4] 构建的最新 8.3 版本。
两个应用程序都通过请求路径 “api/values/{id}” 返回文本“值”。
.NET Core MVC
##### .NET Core MVC
![](https://cdn-images-1.medium.com/max/1600/1*v2VJL3-I3bLyuehntuqfng.png)
Logo 由 [Pablo Iglesias][5] 设计。
可以使用 `dotnet new webapi` 命令创建项目,其 `webapi` 模板会为您生成代码,代码包含 `GET` 请求方法的 `返回“值”`
_源代码_
源代码:
```
using System;
@ -165,8 +161,7 @@ namespace netcore_mvc.Controllers
}
```
_运行 .NET Core web 服务项目_
运行 .NET Core web 服务项目:
```
$ cd netcore-mvc
@ -177,7 +172,7 @@ Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.
```
_运行和定位 HTTP 基准工具_
运行和定位 HTTP 基准工具:
```
$ bombardier -c 125 -n 5000000 http://localhost:5000/api/values/5
@ -193,13 +188,13 @@ Statistics Avg Stdev Max
Throughput: 8.91MB/s
```
Iris MVC
##### Iris MVC
![](https://cdn-images-1.medium.com/max/1600/1*zf4BjL-7MQNJGikw5E-iNA.png)
Logo 由 [Santosh Anand][6] 设计。
_源代码_
源代码:
```
package main
@ -217,7 +212,6 @@ func main() {
view raw
```
```
package controllers
@ -242,8 +236,7 @@ func (vc *ValuesController) Put() {}
func (vc *ValuesController) Delete() {}
```
_运行 Go web 服务项目_
运行 Go web 服务项目:
```
$ cd iris-mvc
@ -252,7 +245,7 @@ Now listening on: http://localhost:5000
Application started. Press CTRL+C to shut down.
```
_运行和定位 HTTP 基准工具_
运行和定位 HTTP 基准工具:
```
$ bombardier -c 125 -n 5000000 http://localhost:5000/api/values/5
@ -275,55 +268,44 @@ Statistics Avg Stdev Max
#### 总结
* 完成 `5000000 个请求`的时间 - 越短越好。
* 请求次数/每秒 - 越大越好。
* 等待时间 — 越短越好。
* 吞吐量 — 越大越好。
* 内存使用 — 越小越好。
* LOC (代码行数) — 越少越好。
.NET Core MVC 应用程序,使用 86 行代码,运行 2 分钟 8 秒,每秒接纳 39311.56 个请求,平均每秒有 3.19ms 等待,最大时到 229.73ms,内存使用大约为 126MB不包括 dotnet 框架)。
.NET Core MVC 应用程序,使用 86 行代码,运行 2 分钟 8 秒,每秒接纳 39311.56 个请求,平均 3.19ms 等待,最大时到 229.73ms,内存使用大约为 126MB不包括 dotnet 框架)。
Iris MVC 应用程序,使用 27 行代码,运行 47 秒,每秒接纳 105643.71 个请求,平均每秒有 1.18ms 等待,最大时到 22.01ms,内存使用大约为 12MB。
Iris MVC 应用程序,使用 27 行代码,运行 47 秒,每秒接纳 105643.71 个请求,平均 1.18ms 等待,最大时到 22.01ms,内存使用大约为 12MB。
> 还有另外一个模板的基准,滚动到底部。
2017 年 8 月 20 号更新
**2017 年 8 月 20 号更新**
[Josh Clark] [24] 和 [Scott Hanselman] [25]在此 [tweet 评论] [26]上指出,.NET Core `Startup.cs` 文件中 `services.AddMvc();` 这行可以替换为 `services.AddMvcCore();`。我听从他们的意见,修改代码,重新运行基准,该文章的 .NET Core 应用程序的基准输出已经修改。
@topdawgevh @shanselman 他们也在使用 `AddMvc()` 而不是 `AddMvcCore()` ...,难道都不包含中间件?
@topdawgevh @shanselman 他们也在使用 AddMvc() 而不是 AddMvcCore() ...,难道都不包含中间件?
 — @clarkis117
 —  @clarkis117
@clarkis117 @topdawgevh Cool @MakisMaropoulos @ben_a_adams @davidfowl 我们来看看。认真学习下怎么使用更简单的性能默认值。
 — @shanselman
 —  @shanselman
@shanselman @clarkis117 @topdawgevh @ben_a_adams @davidfowl @shanselman @ben_a_adams @davidfowl 谢谢您们的反馈意见。我已经修改,更新了结果,没什么不同。对其它的建议,我非常欢迎。
 — @MakisMaropoulos
>它有点稍微的不同但相差不大(从 8.61MB/s 到 8.91MB/s)
 —  @MakisMaropoulos
> 它有点稍微的不同但相差不大(从 8.61MB/s 到 8.91MB/s
想要了解跟 `services.AddMvc()` 标准比较结果的,可以点击[这儿][27]。
* * *
### 想再多了解点儿吗?
我们再制定一个基准,产生 `1000000 次请求`,这次会通过视图引擎由模板生成 `HTML` 页面。
#### .NET Core MVC 使用的模板
```
using System;
@ -477,8 +459,7 @@ https://github.com/kataras/iris/tree/master/_benchmarks/netcore-mvc-templates
```
_运行 .NET Core 服务项目_
运行 .NET Core 服务项目:
```
$ cd netcore-mvc-templates
@ -489,7 +470,7 @@ Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.
```
_运行和定位 HTTP 基准工具_
运行 HTTP 基准工具:
```
Bombarding http://localhost:5000 with 1000000 requests using 125 connections
@ -620,10 +601,7 @@ https://github.com/kataras/iris/tree/master/_benchmarks/iris-mvc-templates
```
_运行 Go 服务项目_
运行 Go 服务项目:
```
$ cd iris-mvc-templates
@ -633,7 +611,7 @@ Application started. Press CTRL+C to shut down.
```
_运行和定位 HTTP 基准工具_
运行 HTTP 基准工具:
```
Bombarding http://localhost:5000 with 1000000 requests using 125 connections
@ -648,22 +626,17 @@ Statistics Avg Stdev Max
Throughput: 192.51MB/s
```
总结
#### 总结
* 完成 `1000000 个请求`的时间 - 越短越好。
* 请求次数/每秒 - 越大越好。
* 等待时间 — 越短越好。
* 内存使用 — 越小越好。
* 吞吐量 — 越大越好。
.NET Core MVC 模板应用程序,运行 1 分钟 20 秒,每秒接纳 11738.60 个请求,同时每秒生成 89.03M 页面,平均 10.10ms 等待,最大时到 1.97s,内存使用大约为 193MB不包括 dotnet 框架)。
.NET Core MVC 模板应用程序,运行 1 分钟 20 秒,每秒接纳 11738.60 个请求,同时每秒生成 89.03M 页面,平均每秒有 10.10ms 等待,最大时到 1.97s,内存使用大约为 193MB不包括 dotnet 框架)。
Iris MVC 模板应用程序,运行 37 秒,每秒接纳 26656.76 个请求,同时每秒生成 192.51M 页面,平均每秒有 1.18ms 等待,最大时到 22.52ms,内存使用大约为 17MB。
Iris MVC 模板应用程序,运行 37 秒,每秒接纳 26656.76 个请求,同时每秒生成 192.51M 页面,平均 1.18ms 等待,最大时到 22.52ms,内存使用大约为 17MB。
### 接下来呢?
@ -673,10 +646,6 @@ Iris MVC 模板应用程序,运行 37 秒,每秒接纳 26656.76 个请求,
我也需要亲自感谢下 [dev.to][34] 团队,感谢把我的这篇文章分享到他们的 Twitter 账户。
论 HTTP 性能Go 与 .NET Core 谁争雌雄 {作者:@MakisMaropoulos} https://t.co/IXL5LSpnjX
 — @ThePracticalDev
感谢大家真心反馈,玩得开心!
@ -684,15 +653,15 @@ Iris MVC 模板应用程序,运行 37 秒,每秒接纳 26656.76 个请求,
很多人联系我,希望看到一个基于 .NET Core 的较低级别 Kestrel 的基准测试文章。
因此我完成了,请点击下面的链接来了解 Kestrel 和 Iris 之间的性能差异,它还包含一个会话存储管理基准!
因此我完成了,请点击下面的[链接][35]来了解 Kestrel 和 Iris 之间的性能差异,它还包含一个会话存储管理基准!
--------------------------------------------------------------------------------
via: https://hackernoon.com/go-vs-net-core-in-terms-of-http-performance-7535a61b67b8
作者:[ Gerasimos Maropoulos][a]
作者:[Gerasimos Maropoulos][a]
译者:[runningwater](https://github.com/runningwater)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
@ -731,3 +700,4 @@ via: https://hackernoon.com/go-vs-net-core-in-terms-of-http-performance-7535a61b
[32]:https://github.com/kataras/iris/tree/master/_benchmarks
[33]:https://github.com/kataras/iris
[34]:https://dev.to/kataras/go-vsnet-core-in-terms-of-http-performance
[35]:https://medium.com/@kataras/iris-go-vs-net-core-kestrel-in-terms-of-http-performance-806195dc93d5