From e9dafa16ddaa645abbb0740d7c0efc14b0c22e76 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Mon, 22 May 2017 12:48:11 -0700 Subject: [PATCH 1/2] Bring over a few changes from the TechEmpower repo - incorporate aspnet/FrameworkBenchmarks@4830e2fc, "Only Prepare DbCommand once" - enable more scenarios e.g. "--scenarios plaintext" also enables "mvc/plaintext" scenario - optimize `Content-Length` setting in plaintext scenario - remove unused Microsoft.EntityFrameworkCore.Design dependency and EF tooling - remove irrelevant `#if NET46` code nits: - sort dependencies - clean up whitespace - accept VS suggestions --- src/Benchmarks/Benchmarks.csproj | 8 +- src/Benchmarks/Configuration/AppSettings.cs | 6 +- src/Benchmarks/Configuration/Scenarios.cs | 4 +- src/Benchmarks/Data/ApplicationDbContext.cs | 4 +- src/Benchmarks/Data/ApplicationDbSeeder.cs | 4 +- src/Benchmarks/Data/DapperDb.cs | 6 +- src/Benchmarks/Data/EfDb.cs | 4 +- src/Benchmarks/Data/RawDb.cs | 83 ++++++++++--------- src/Benchmarks/Data/World.cs | 4 +- .../Middleware/DebugInfoPageMiddleware.cs | 10 +-- .../Middleware/FortunesDapperMiddleware.cs | 6 +- .../Middleware/FortunesRawMiddleware.cs | 6 +- .../Middleware/MiddlewareHelpers.cs | 1 - .../MultipleQueriesDapperMiddleware.cs | 4 +- .../MultipleQueriesRawMiddleware.cs | 4 +- .../MultipleUpdatesDapperMiddleware.cs | 4 +- .../MultipleUpdatesRawMiddleware.cs | 4 +- .../Middleware/PlaintextMiddleware.cs | 14 ++-- .../Middleware/SingleQueryDapperMiddleware.cs | 4 +- .../Middleware/SingleQueryEfMiddleware.cs | 1 - .../Middleware/SingleQueryRawMiddleware.cs | 4 +- src/Benchmarks/Program.cs | 6 +- src/Benchmarks/Startup.cs | 4 +- 23 files changed, 95 insertions(+), 100 deletions(-) diff --git a/src/Benchmarks/Benchmarks.csproj b/src/Benchmarks/Benchmarks.csproj index d65c30e7a..91ad853c9 100644 --- a/src/Benchmarks/Benchmarks.csproj +++ b/src/Benchmarks/Benchmarks.csproj @@ -8,7 +8,6 @@ - @@ -17,7 +16,6 @@ - @@ -31,10 +29,6 @@ --> + - - - - - diff --git a/src/Benchmarks/Configuration/AppSettings.cs b/src/Benchmarks/Configuration/AppSettings.cs index 5cde8902f..e0b407b57 100644 --- a/src/Benchmarks/Configuration/AppSettings.cs +++ b/src/Benchmarks/Configuration/AppSettings.cs @@ -1,7 +1,5 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.Extensions.Logging; +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Benchmarks.Configuration { diff --git a/src/Benchmarks/Configuration/Scenarios.cs b/src/Benchmarks/Configuration/Scenarios.cs index 8e09c8ea8..993bd1cd4 100644 --- a/src/Benchmarks/Configuration/Scenarios.cs +++ b/src/Benchmarks/Configuration/Scenarios.cs @@ -155,14 +155,14 @@ public static string GetPath(Expression> scenarioExpressio public int Enable(string partialName) { - if(string.Equals(partialName, "[default]", StringComparison.OrdinalIgnoreCase)) + if (string.Equals(partialName, "[default]", StringComparison.OrdinalIgnoreCase)) { EnableDefault(); return 2; } var props = typeof(Scenarios).GetTypeInfo().DeclaredProperties - .Where(p => string.Equals(partialName, "[all]", StringComparison.OrdinalIgnoreCase) || p.Name.StartsWith(partialName, StringComparison.OrdinalIgnoreCase)) + .Where(p => string.Equals(partialName, "[all]", StringComparison.OrdinalIgnoreCase) || p.Name.IndexOf(partialName, StringComparison.OrdinalIgnoreCase) >= 0) .ToList(); foreach (var p in props) diff --git a/src/Benchmarks/Data/ApplicationDbContext.cs b/src/Benchmarks/Data/ApplicationDbContext.cs index ea96ada00..9c87e3100 100644 --- a/src/Benchmarks/Data/ApplicationDbContext.cs +++ b/src/Benchmarks/Data/ApplicationDbContext.cs @@ -1,5 +1,5 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.EntityFrameworkCore; diff --git a/src/Benchmarks/Data/ApplicationDbSeeder.cs b/src/Benchmarks/Data/ApplicationDbSeeder.cs index 8db0c90d6..3bb578eef 100644 --- a/src/Benchmarks/Data/ApplicationDbSeeder.cs +++ b/src/Benchmarks/Data/ApplicationDbSeeder.cs @@ -1,5 +1,5 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Linq; diff --git a/src/Benchmarks/Data/DapperDb.cs b/src/Benchmarks/Data/DapperDb.cs index fe2a1fd63..963268fcb 100644 --- a/src/Benchmarks/Data/DapperDb.cs +++ b/src/Benchmarks/Data/DapperDb.cs @@ -1,5 +1,5 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; @@ -40,7 +40,7 @@ public async Task LoadSingleQueryRow() async Task ReadSingleRow(DbConnection db) { return await db.QueryFirstOrDefaultAsync( - "SELECT id, randomnumber FROM world WHERE Id = @Id", + "SELECT id, randomnumber FROM world WHERE id = @Id", new { Id = _random.Next(1, 10001) }); } diff --git a/src/Benchmarks/Data/EfDb.cs b/src/Benchmarks/Data/EfDb.cs index f53a4fff8..061beeeac 100644 --- a/src/Benchmarks/Data/EfDb.cs +++ b/src/Benchmarks/Data/EfDb.cs @@ -1,5 +1,5 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Benchmarks/Data/RawDb.cs b/src/Benchmarks/Data/RawDb.cs index 2d1233dfe..abba54fac 100644 --- a/src/Benchmarks/Data/RawDb.cs +++ b/src/Benchmarks/Data/RawDb.cs @@ -28,20 +28,19 @@ public RawDb(IRandom random, DbProviderFactory dbProviderFactory, IOptions LoadSingleQueryRow() { using (var db = _dbProviderFactory.CreateConnection()) - using (var cmd = CreateReadCommand(db)) { db.ConnectionString = _connectionString; await db.OpenAsync(); - return await ReadSingleRow(db, cmd); + using (var cmd = CreateReadCommand(db)) + { + return await ReadSingleRow(db, cmd); + } } } async Task ReadSingleRow(DbConnection connection, DbCommand cmd) { - // Prepared statements improve PostgreSQL performance by 10-15% - cmd.Prepare(); - using (var rdr = await cmd.ExecuteReaderAsync(CommandBehavior.SingleRow)) { await rdr.ReadAsync(); @@ -64,6 +63,10 @@ DbCommand CreateReadCommand(DbConnection connection) id.Value = _random.Next(1, 10001); cmd.Parameters.Add(id); + // Prepared statements improve PostgreSQL performance by 10-15% + // Especially if you only call them once, instead of on every execution :) + cmd.Prepare(); + return cmd; } @@ -72,14 +75,16 @@ public async Task LoadMultipleQueriesRows(int count) var result = new World[count]; using (var db = _dbProviderFactory.CreateConnection()) - using (var cmd = CreateReadCommand(db)) { db.ConnectionString = _connectionString; await db.OpenAsync(); - for (int i = 0; i < count; i++) + using (var cmd = CreateReadCommand(db)) { - result[i] = await ReadSingleRow(db, cmd); - cmd.Parameters["@Id"].Value = _random.Next(1, 10001); + for (int i = 0; i < count; i++) + { + result[i] = await ReadSingleRow(db, cmd); + cmd.Parameters["@Id"].Value = _random.Next(1, 10001); + } } } @@ -93,43 +98,45 @@ public async Task LoadMultipleUpdatesRows(int count) var updateCommand = new StringBuilder(count); using (var db = _dbProviderFactory.CreateConnection()) - using (var updateCmd = db.CreateCommand()) - using (var queryCmd = CreateReadCommand(db)) { db.ConnectionString = _connectionString; await db.OpenAsync(); - for (int i = 0; i < count; i++) + using (var updateCmd = db.CreateCommand()) + using (var queryCmd = CreateReadCommand(db)) { - results[i] = await ReadSingleRow(db, queryCmd); - queryCmd.Parameters["@Id"].Value = _random.Next(1, 10001); - } + for (int i = 0; i < count; i++) + { + results[i] = await ReadSingleRow(db, queryCmd); + queryCmd.Parameters["@Id"].Value = _random.Next(1, 10001); + } - // postgres has problems with deadlocks when these aren't sorted - Array.Sort(results, (a, b) => a.Id.CompareTo(b.Id)); + // postgres has problems with deadlocks when these aren't sorted + Array.Sort(results, (a, b) => a.Id.CompareTo(b.Id)); - for(int i = 0; i < count; i++) - { - var id = updateCmd.CreateParameter(); - id.ParameterName = BatchUpdateString.Strings[i].Id; - id.DbType = DbType.Int32; - updateCmd.Parameters.Add(id); - - var random = updateCmd.CreateParameter(); - random.ParameterName = BatchUpdateString.Strings[i].Random; - id.DbType = DbType.Int32; - updateCmd.Parameters.Add(random); - - var randomNumber = _random.Next(1, 10001); - id.Value = results[i].Id; - random.Value = randomNumber; - results[i].RandomNumber = randomNumber; - - updateCommand.Append(BatchUpdateString.Strings[i].UpdateQuery); - } + for(int i = 0; i < count; i++) + { + var id = updateCmd.CreateParameter(); + id.ParameterName = BatchUpdateString.Strings[i].Id; + id.DbType = DbType.Int32; + updateCmd.Parameters.Add(id); + + var random = updateCmd.CreateParameter(); + random.ParameterName = BatchUpdateString.Strings[i].Random; + id.DbType = DbType.Int32; + updateCmd.Parameters.Add(random); + + var randomNumber = _random.Next(1, 10001); + id.Value = results[i].Id; + random.Value = randomNumber; + results[i].RandomNumber = randomNumber; + + updateCommand.Append(BatchUpdateString.Strings[i].UpdateQuery); + } - updateCmd.CommandText = updateCommand.ToString(); - await updateCmd.ExecuteNonQueryAsync(); + updateCmd.CommandText = updateCommand.ToString(); + await updateCmd.ExecuteNonQueryAsync(); + } } return results; diff --git a/src/Benchmarks/Data/World.cs b/src/Benchmarks/Data/World.cs index 93d6f6a61..d8e2c780b 100644 --- a/src/Benchmarks/Data/World.cs +++ b/src/Benchmarks/Data/World.cs @@ -1,5 +1,5 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.ComponentModel.DataAnnotations.Schema; diff --git a/src/Benchmarks/Middleware/DebugInfoPageMiddleware.cs b/src/Benchmarks/Middleware/DebugInfoPageMiddleware.cs index 34aeec88b..a4886d753 100644 --- a/src/Benchmarks/Middleware/DebugInfoPageMiddleware.cs +++ b/src/Benchmarks/Middleware/DebugInfoPageMiddleware.cs @@ -1,5 +1,5 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Linq; @@ -24,13 +24,7 @@ public class DebugInfoPageMiddleware private static readonly string _configurationName = ""; #endif -#if NET46 - private static readonly string _targetFrameworkName = AppDomain.CurrentDomain.SetupInformation.TargetFrameworkName; -#elif NETCOREAPP2_0 private static readonly string _targetFrameworkName = AppContext.TargetFrameworkName; -#else -#error the target framework needs to be updated. -#endif private readonly IHostingEnvironment _hostingEnv; private readonly RequestDelegate _next; diff --git a/src/Benchmarks/Middleware/FortunesDapperMiddleware.cs b/src/Benchmarks/Middleware/FortunesDapperMiddleware.cs index 923369150..d745a975d 100644 --- a/src/Benchmarks/Middleware/FortunesDapperMiddleware.cs +++ b/src/Benchmarks/Middleware/FortunesDapperMiddleware.cs @@ -1,5 +1,5 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Text.Encodings.Web; @@ -40,7 +40,7 @@ public async Task Invoke(HttpContext httpContext) await _next(httpContext); } } - + public static class FortunesDapperMiddlewareExtensions { public static IApplicationBuilder UseFortunesDapper(this IApplicationBuilder builder) diff --git a/src/Benchmarks/Middleware/FortunesRawMiddleware.cs b/src/Benchmarks/Middleware/FortunesRawMiddleware.cs index 6ce8bf59c..096c1673c 100644 --- a/src/Benchmarks/Middleware/FortunesRawMiddleware.cs +++ b/src/Benchmarks/Middleware/FortunesRawMiddleware.cs @@ -1,5 +1,5 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Text.Encodings.Web; @@ -40,7 +40,7 @@ public async Task Invoke(HttpContext httpContext) await _next(httpContext); } } - + public static class FortunesRawMiddlewareExtensions { public static IApplicationBuilder UseFortunesRaw(this IApplicationBuilder builder) diff --git a/src/Benchmarks/Middleware/MiddlewareHelpers.cs b/src/Benchmarks/Middleware/MiddlewareHelpers.cs index 09d868a9c..d2243aeb8 100644 --- a/src/Benchmarks/Middleware/MiddlewareHelpers.cs +++ b/src/Benchmarks/Middleware/MiddlewareHelpers.cs @@ -51,7 +51,6 @@ public static async Task RenderFortunesHtml(IEnumerable model, HttpCont // fortunes includes multibyte characters so response.Length is incorrect httpContext.Response.ContentLength = Encoding.UTF8.GetByteCount(response); await httpContext.Response.WriteAsync(response); - } } } diff --git a/src/Benchmarks/Middleware/MultipleQueriesDapperMiddleware.cs b/src/Benchmarks/Middleware/MultipleQueriesDapperMiddleware.cs index f9fc42cfc..197ce07f1 100644 --- a/src/Benchmarks/Middleware/MultipleQueriesDapperMiddleware.cs +++ b/src/Benchmarks/Middleware/MultipleQueriesDapperMiddleware.cs @@ -1,5 +1,5 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Threading.Tasks; diff --git a/src/Benchmarks/Middleware/MultipleQueriesRawMiddleware.cs b/src/Benchmarks/Middleware/MultipleQueriesRawMiddleware.cs index d41bbd5c9..1fb0c41ab 100644 --- a/src/Benchmarks/Middleware/MultipleQueriesRawMiddleware.cs +++ b/src/Benchmarks/Middleware/MultipleQueriesRawMiddleware.cs @@ -1,5 +1,5 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Threading.Tasks; diff --git a/src/Benchmarks/Middleware/MultipleUpdatesDapperMiddleware.cs b/src/Benchmarks/Middleware/MultipleUpdatesDapperMiddleware.cs index 2661e62ff..a2566840c 100644 --- a/src/Benchmarks/Middleware/MultipleUpdatesDapperMiddleware.cs +++ b/src/Benchmarks/Middleware/MultipleUpdatesDapperMiddleware.cs @@ -1,5 +1,5 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Threading.Tasks; diff --git a/src/Benchmarks/Middleware/MultipleUpdatesRawMiddleware.cs b/src/Benchmarks/Middleware/MultipleUpdatesRawMiddleware.cs index f9e9a3d28..bff8ced15 100644 --- a/src/Benchmarks/Middleware/MultipleUpdatesRawMiddleware.cs +++ b/src/Benchmarks/Middleware/MultipleUpdatesRawMiddleware.cs @@ -1,5 +1,5 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Threading.Tasks; diff --git a/src/Benchmarks/Middleware/PlaintextMiddleware.cs b/src/Benchmarks/Middleware/PlaintextMiddleware.cs index 6adcb48cd..12f200698 100644 --- a/src/Benchmarks/Middleware/PlaintextMiddleware.cs +++ b/src/Benchmarks/Middleware/PlaintextMiddleware.cs @@ -1,5 +1,5 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Text; @@ -16,7 +16,7 @@ public class PlaintextMiddleware private static readonly byte[] _helloWorldPayload = Encoding.UTF8.GetBytes("Hello, World!"); private readonly RequestDelegate _next; - + public PlaintextMiddleware(RequestDelegate next) { _next = next; @@ -37,11 +37,15 @@ public static Task WriteResponse(HttpResponse response) var payloadLength = _helloWorldPayload.Length; response.StatusCode = 200; response.ContentType = "text/plain"; - response.ContentLength = payloadLength; + + // HACK: Setting the Content-Length header manually avoids the cost of serializing the int to a string. + // This is instead of: httpContext.Response.ContentLength = payloadLength; + response.Headers["Content-Length"] = "13"; + return response.Body.WriteAsync(_helloWorldPayload, 0, payloadLength); } } - + public static class PlaintextMiddlewareExtensions { public static IApplicationBuilder UsePlainText(this IApplicationBuilder builder) diff --git a/src/Benchmarks/Middleware/SingleQueryDapperMiddleware.cs b/src/Benchmarks/Middleware/SingleQueryDapperMiddleware.cs index dfcb5e731..9db7abc64 100644 --- a/src/Benchmarks/Middleware/SingleQueryDapperMiddleware.cs +++ b/src/Benchmarks/Middleware/SingleQueryDapperMiddleware.cs @@ -1,5 +1,5 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Threading.Tasks; diff --git a/src/Benchmarks/Middleware/SingleQueryEfMiddleware.cs b/src/Benchmarks/Middleware/SingleQueryEfMiddleware.cs index cb1200606..187d8788d 100644 --- a/src/Benchmarks/Middleware/SingleQueryEfMiddleware.cs +++ b/src/Benchmarks/Middleware/SingleQueryEfMiddleware.cs @@ -8,7 +8,6 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; - using Newtonsoft.Json; using Newtonsoft.Json.Serialization; diff --git a/src/Benchmarks/Middleware/SingleQueryRawMiddleware.cs b/src/Benchmarks/Middleware/SingleQueryRawMiddleware.cs index f8272ee25..06ae31496 100644 --- a/src/Benchmarks/Middleware/SingleQueryRawMiddleware.cs +++ b/src/Benchmarks/Middleware/SingleQueryRawMiddleware.cs @@ -1,5 +1,5 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Threading.Tasks; diff --git a/src/Benchmarks/Program.cs b/src/Benchmarks/Program.cs index 5efe3d7e9..7e28d38e4 100644 --- a/src/Benchmarks/Program.cs +++ b/src/Benchmarks/Program.cs @@ -189,9 +189,11 @@ private static void StartInteractiveConsoleThread() Console.WriteLine($"Gen 0: {GC.CollectionCount(0)}, Gen 1: {GC.CollectionCount(1)}, Gen 2: {GC.CollectionCount(2)}"); } } - }); + }) + { + IsBackground = true + }; - interactiveThread.IsBackground = true; interactiveThread.Start(); started.WaitOne(); diff --git a/src/Benchmarks/Startup.cs b/src/Benchmarks/Startup.cs index 8c6d8ddb4..d123b0ad8 100644 --- a/src/Benchmarks/Startup.cs +++ b/src/Benchmarks/Startup.cs @@ -14,7 +14,6 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Npgsql; @@ -143,8 +142,7 @@ public IServiceProvider ConfigureServices(IServiceCollection services) return services.BuildServiceProvider(validateScopes: true); } - public void Configure(IApplicationBuilder app, ApplicationDbSeeder dbSeeder, IOptions appSettings, - ILoggerFactory loggerFactory) + public void Configure(IApplicationBuilder app, ApplicationDbSeeder dbSeeder) { if (Scenarios.StaticFiles) { From fcb35bce0a2af96d79856e5b3437ef0c3488dd63 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Mon, 22 May 2017 22:01:15 -0700 Subject: [PATCH 2/2] Revert two bits - enable more scenarios e.g. "--scenarios plaintext" also enables "mvc/plaintext" scenario - stick with enabling the minimum - optimize `Content-Length` setting in plaintext scenario - wasn't an optimization --- src/Benchmarks/Configuration/Scenarios.cs | 2 +- src/Benchmarks/Middleware/PlaintextMiddleware.cs | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/Benchmarks/Configuration/Scenarios.cs b/src/Benchmarks/Configuration/Scenarios.cs index 993bd1cd4..cee5b4e47 100644 --- a/src/Benchmarks/Configuration/Scenarios.cs +++ b/src/Benchmarks/Configuration/Scenarios.cs @@ -162,7 +162,7 @@ public int Enable(string partialName) } var props = typeof(Scenarios).GetTypeInfo().DeclaredProperties - .Where(p => string.Equals(partialName, "[all]", StringComparison.OrdinalIgnoreCase) || p.Name.IndexOf(partialName, StringComparison.OrdinalIgnoreCase) >= 0) + .Where(p => string.Equals(partialName, "[all]", StringComparison.OrdinalIgnoreCase) || p.Name.StartsWith(partialName, StringComparison.OrdinalIgnoreCase)) .ToList(); foreach (var p in props) diff --git a/src/Benchmarks/Middleware/PlaintextMiddleware.cs b/src/Benchmarks/Middleware/PlaintextMiddleware.cs index 12f200698..2cd1d23b7 100644 --- a/src/Benchmarks/Middleware/PlaintextMiddleware.cs +++ b/src/Benchmarks/Middleware/PlaintextMiddleware.cs @@ -37,11 +37,7 @@ public static Task WriteResponse(HttpResponse response) var payloadLength = _helloWorldPayload.Length; response.StatusCode = 200; response.ContentType = "text/plain"; - - // HACK: Setting the Content-Length header manually avoids the cost of serializing the int to a string. - // This is instead of: httpContext.Response.ContentLength = payloadLength; - response.Headers["Content-Length"] = "13"; - + response.ContentLength = payloadLength; return response.Body.WriteAsync(_helloWorldPayload, 0, payloadLength); } }