From ca4c66d5b4040470797e23e5fa24647b41192352 Mon Sep 17 00:00:00 2001 From: kataras Date: Sat, 19 Aug 2017 06:06:05 +0300 Subject: [PATCH] .NET Core vs Iris MVC vs Iris (classic API with Handlers) Former-commit-id: 19c71f41c0864d2f3f36627e9da53b4802a4476b --- .gitattributes | 3 +- README.md | 2 +- _benchmarks/README.md | 101 ++++++++++++++++++ .../iris-mvc/controllers/values_controller.go | 21 ++++ _benchmarks/iris-mvc/main.go | 12 +++ _benchmarks/iris/main.go | 28 +++++ .../Controllers/ValuesController.cs | 33 ++++++ _benchmarks/netcore-mvc/Program.cs | 25 +++++ _benchmarks/netcore-mvc/Startup.cs | 35 ++++++ _benchmarks/netcore-mvc/appsettings.json | 15 +++ _benchmarks/netcore-mvc/netcore-mvc.csproj | 19 ++++ .../screens/500m_requests_iris-mvc.png | Bin 0 -> 11467 bytes _benchmarks/screens/500m_requests_iris.png | Bin 0 -> 11710 bytes .../screens/500m_requests_netcore-mvc.png | Bin 0 -> 11621 bytes 14 files changed, 292 insertions(+), 2 deletions(-) create mode 100644 _benchmarks/README.md create mode 100644 _benchmarks/iris-mvc/controllers/values_controller.go create mode 100644 _benchmarks/iris-mvc/main.go create mode 100644 _benchmarks/iris/main.go create mode 100644 _benchmarks/netcore-mvc/Controllers/ValuesController.cs create mode 100644 _benchmarks/netcore-mvc/Program.cs create mode 100644 _benchmarks/netcore-mvc/Startup.cs create mode 100644 _benchmarks/netcore-mvc/appsettings.json create mode 100644 _benchmarks/netcore-mvc/netcore-mvc.csproj create mode 100644 _benchmarks/screens/500m_requests_iris-mvc.png create mode 100644 _benchmarks/screens/500m_requests_iris.png create mode 100644 _benchmarks/screens/500m_requests_netcore-mvc.png diff --git a/.gitattributes b/.gitattributes index 05fd0d8e..bae831c3 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,4 @@ *.go linguist-language=Go vendor/* linguist-vendored -_examples/* linguist-documentation \ No newline at end of file +_examples/* linguist-documentation +_benchmarks/* linguist-documentation \ No newline at end of file diff --git a/README.md b/README.md index 687f9f6c..ffbd9d3a 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ Iris may have reached version 8, but we're not stopping there. We have many feat ### 📑 Table of contents * [Installation](#-installation) -* [Latest changes](https://github.com/kataras/iris/blob/master/HISTORY.md#mo-14-august-2017--v826) +* [Latest changes](https://github.com/kataras/iris/blob/master/HISTORY.md#fr-18-august-2017--v830) * [Learn](#-learn) * [HTTP Listening](_examples/#http-listening) * [Configuration](_examples/#configuration) diff --git a/_benchmarks/README.md b/_benchmarks/README.md new file mode 100644 index 00000000..814f2b55 --- /dev/null +++ b/_benchmarks/README.md @@ -0,0 +1,101 @@ +## Hardware + +* Processor: Intel(R) Core(TM) **i7-4710HQ** CPU @ 2.50GHz 2.50GHz +* RAM: **8.00 GB** + +## Software + +* OS: Microsoft **Windows** [Version **10**.0.15063] +* HTTP Benchmark Tool: https://github.com/codesenberg/bombardier, latest version **1.1** +* **.NET Core**: https://www.microsoft.com/net/core, latest version **2.0** +* **Iris**: https://github.com/kataras/iris, latest version **8.3** built with [go1.8.3](https://golang.org) + +## Results + +### .NET Core MVC +```bash +$ cd netcore-mvc +$ dotnet run +Hosting environment: Production +Content root path: C:\mygopath\src\github.com\kataras\iris\_benchmarks\netcore-mvc +Now listening on: http://localhost:5000 +Application started. Press Ctrl+C to shut down. +``` + +```bash +$ bombardier -c 125 -n 5000000 http://localhost:5000/api/values/5 +Bombarding http://localhost:5000/api/values/5 with 5000000 requests using 125 connections + 5000000 / 5000000 [====================================================================================] 100.00% 2m39s +Done! +Statistics Avg Stdev Max + Reqs/sec 31532.63 10360.09 259792 + Latency 3.99ms 2.32ms 297.21ms + HTTP codes: + 1xx - 0, 2xx - 5000000, 3xx - 0, 4xx - 0, 5xx - 0 + others - 0 + Throughput: 6.89MB/s +``` +> 127210K Memory (private working set) + +### Iris MVC +```bash +$ cd iris-mvc +$ go run main.go +Now listening on: http://localhost:5000 +Application started. Press CTRL+C to shut down. +``` + +```bash +$ bombardier -c 125 -n 5000000 http://localhost:5000/api/values/5 +Bombarding http://localhost:5000/api/values/5 with 5000000 requests using 125 connections + 5000000 / 5000000 [======================================================================================] 100.00% 58s +Done! +Statistics Avg Stdev Max + Reqs/sec 86087.86 3432.38 93833 + Latency 1.45ms 464.12us 42.53ms + HTTP codes: + 1xx - 0, 2xx - 5000000, 3xx - 0, 4xx - 0, 5xx - 0 + others - 0 + Throughput: 16.01MB/s +``` +> 11816K Memory (private working set) + +### Iris +```bash +$ cd iris +$ go run main.go +Now listening on: http://localhost:5000 +Application started. Press CTRL+C to shut down. +``` + +```bash +$ bombardier -c 125 -n 5000000 http://localhost:5000/api/values/5 +Bombarding http://localhost:5000/api/values/5 with 5000000 requests using 125 connections + 5000000 / 5000000 [======================================================================================] 100.00% 48s +Done! +Statistics Avg Stdev Max + Reqs/sec 102987.54 8333.43 120069 + Latency 1.21ms 369.71us 23.52ms + HTTP codes: + 1xx - 0, 2xx - 5000000, 3xx - 0, 4xx - 0, 5xx - 0 + others - 0 + Throughput: 19.15MB/s +``` +> 11040K Memory (private working set) + +Click [here](screens) to navigate to the screenshots. + +#### Summary + +* Time to complete the `5000000 requests` - smaller is better. +* Reqs/sec - bigger is better. +* Latency - smaller is better +* Throughput - bigger is better. +* Memory usage - smaller is better. +* LOC (Lines Of Code) - smaller is better. + +.NET Core MVC Application, written using 86 lines of code, ran for **2 minutes and 39 seconds** serving **31532.63** requests per second and **3.99ms** latency in average and **297.21ms** max, the memory usage of all these was 127MB (without the dotnet host). + +Iris MVC Application, written using 27 lines of code, ran for **58 seconds** serving **86087.86** requests per second and **1.45ms** latency in average and **42.53ms** max, the memory usage of all these was 12MB. + +Iris Application, written using 22 lines of code, ran for **48 seconds** serving **102987.54** requests per second and **1.21ms** latency in average and **23.52ms** max, the memory usage of all these was 11MB. \ No newline at end of file diff --git a/_benchmarks/iris-mvc/controllers/values_controller.go b/_benchmarks/iris-mvc/controllers/values_controller.go new file mode 100644 index 00000000..229492a7 --- /dev/null +++ b/_benchmarks/iris-mvc/controllers/values_controller.go @@ -0,0 +1,21 @@ +package controllers + +import "github.com/kataras/iris/mvc" + +// ValuesController is the equivalent +// `ValuesController` of the .net core 2.0 mvc application. +type ValuesController struct { + mvc.Controller +} + +// Get handles "GET" requests to "api/values/{id}". +func (vc *ValuesController) Get() { + // id,_ := vc.Params.GetInt("id") + vc.Ctx.Writef("value") +} + +// Put handles "PUT" requests to "api/values/{id}". +func (vc *ValuesController) Put() {} + +// Delete handles "DELETE" requests to "api/values/{id}". +func (vc *ValuesController) Delete() {} diff --git a/_benchmarks/iris-mvc/main.go b/_benchmarks/iris-mvc/main.go new file mode 100644 index 00000000..5d020110 --- /dev/null +++ b/_benchmarks/iris-mvc/main.go @@ -0,0 +1,12 @@ +package main + +import ( + "github.com/kataras/iris" + "github.com/kataras/iris/_benchmarks/iris-mvc/controllers" +) + +func main() { + app := iris.New() + app.Controller("/api/values/{id}", new(controllers.ValuesController)) + app.Run(iris.Addr(":5000")) +} diff --git a/_benchmarks/iris/main.go b/_benchmarks/iris/main.go new file mode 100644 index 00000000..2dee7991 --- /dev/null +++ b/_benchmarks/iris/main.go @@ -0,0 +1,28 @@ +package main + +import ( + "github.com/kataras/iris" + "github.com/kataras/iris/context" +) + +func main() { + app := iris.New() + // These handlers are serving the same routes as + // `ValuesController`s of netcore-mvc and iris-mvc applications do. + app.Get("/api/values/{id}", getHandler) + app.Put("/api/values/{id}", putHandler) + app.Delete("/api/values/{id}", delHandler) + app.Run(iris.Addr(":5000")) +} + +// getHandler handles "GET" requests to "api/values/{id}". +func getHandler(ctx context.Context) { + // id,_ := vc.Params.GetInt("id") + ctx.Writef("value") +} + +// putHandler handles "PUT" requests to "api/values/{id}". +func putHandler(ctx context.Context) {} + +// delHandler handles "DELETE" requests to "api/values/{id}". +func delHandler(ctx context.Context) {} diff --git a/_benchmarks/netcore-mvc/Controllers/ValuesController.cs b/_benchmarks/netcore-mvc/Controllers/ValuesController.cs new file mode 100644 index 00000000..8198900f --- /dev/null +++ b/_benchmarks/netcore-mvc/Controllers/ValuesController.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; + +namespace netcore_mvc.Controllers +{ + // ValuesController is the equivalent + // `ValuesController` of the Iris 8.3 mvc application. + [Route("api/[controller]")] + public class ValuesController : Controller + { + // Get handles "GET" requests to "api/values/{id}". + [HttpGet("{id}")] + public string Get(int id) + { + return "value"; + } + + // Put handles "PUT" requests to "api/values/{id}". + [HttpPut("{id}")] + public void Put(int id, [FromBody]string value) + { + } + + // Delete handles "DELETE" requests to "api/values/{id}". + [HttpDelete("{id}")] + public void Delete(int id) + { + } + } +} diff --git a/_benchmarks/netcore-mvc/Program.cs b/_benchmarks/netcore-mvc/Program.cs new file mode 100644 index 00000000..fec87ec1 --- /dev/null +++ b/_benchmarks/netcore-mvc/Program.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; + +namespace netcore_mvc +{ + public class Program + { + public static void Main(string[] args) + { + BuildWebHost(args).Run(); + } + + public static IWebHost BuildWebHost(string[] args) => + WebHost.CreateDefaultBuilder(args) + .UseStartup() + .Build(); + } +} diff --git a/_benchmarks/netcore-mvc/Startup.cs b/_benchmarks/netcore-mvc/Startup.cs new file mode 100644 index 00000000..d6019ede --- /dev/null +++ b/_benchmarks/netcore-mvc/Startup.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; + +namespace netcore_mvc +{ + public class Startup + { + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } + + public IConfiguration Configuration { get; } + + // This method gets called by the runtime. Use this method to add services to the container. + public void ConfigureServices(IServiceCollection services) + { + services.AddMvc(); + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IHostingEnvironment env) + { + app.UseMvc(); + } + } +} diff --git a/_benchmarks/netcore-mvc/appsettings.json b/_benchmarks/netcore-mvc/appsettings.json new file mode 100644 index 00000000..3aeec781 --- /dev/null +++ b/_benchmarks/netcore-mvc/appsettings.json @@ -0,0 +1,15 @@ +{ + "Logging": { + "IncludeScopes": false, + "Debug": { + "LogLevel": { + "Default": "Error" + } + }, + "Console": { + "LogLevel": { + "Default": "Error" + } + } + } +} diff --git a/_benchmarks/netcore-mvc/netcore-mvc.csproj b/_benchmarks/netcore-mvc/netcore-mvc.csproj new file mode 100644 index 00000000..89f574c3 --- /dev/null +++ b/_benchmarks/netcore-mvc/netcore-mvc.csproj @@ -0,0 +1,19 @@ + + + + netcoreapp2.0 + + + + + + + + + + + + + + + diff --git a/_benchmarks/screens/500m_requests_iris-mvc.png b/_benchmarks/screens/500m_requests_iris-mvc.png new file mode 100644 index 0000000000000000000000000000000000000000..7f75d52ba10b985e74756a2b5e759b86359fbdef GIT binary patch literal 11467 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 literal 0 HcmV?d00001 diff --git a/_benchmarks/screens/500m_requests_iris.png b/_benchmarks/screens/500m_requests_iris.png new file mode 100644 index 0000000000000000000000000000000000000000..bb6a25792d75cd7d66a7c894dfd4c77154428d33 GIT binary patch literal 11710 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 O$i2I|YPl*F0sjH_@jAl* literal 0 HcmV?d00001 diff --git a/_benchmarks/screens/500m_requests_netcore-mvc.png b/_benchmarks/screens/500m_requests_netcore-mvc.png new file mode 100644 index 0000000000000000000000000000000000000000..13b92c94c338e18528df67a8d87c33755e08a378 GIT binary patch literal 11621 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