Browse Source

Updating to dotnet core 3.0 (#4955)

- Removing SpanJson and Utf8Json scenarios
- Temporarilly removing RHTX scenarios until it's compatible with 3.0
Sébastien Ros 6 years ago
parent
commit
fc1e2e42b7
56 changed files with 242 additions and 538 deletions
  1. 7 7
      frameworks/CSharp/aspnetcore/Benchmarks/Benchmarks.csproj
  2. 0 6
      frameworks/CSharp/aspnetcore/Benchmarks/Configuration/Scenarios.cs
  3. 17 42
      frameworks/CSharp/aspnetcore/Benchmarks/Data/BatchUpdateString.cs
  4. 3 7
      frameworks/CSharp/aspnetcore/Benchmarks/Data/DapperDb.cs
  5. 19 7
      frameworks/CSharp/aspnetcore/Benchmarks/Data/EfDb.cs
  6. 4 8
      frameworks/CSharp/aspnetcore/Benchmarks/Data/RawDb.cs
  7. 8 8
      frameworks/CSharp/aspnetcore/Benchmarks/Middleware/JsonMiddleware.cs
  8. 0 45
      frameworks/CSharp/aspnetcore/Benchmarks/Middleware/SpanJsonMiddleware.cs
  9. 0 52
      frameworks/CSharp/aspnetcore/Benchmarks/Middleware/Utf8JsonMiddleware.cs
  10. 2 0
      frameworks/CSharp/aspnetcore/Benchmarks/Program.cs
  11. 9 22
      frameworks/CSharp/aspnetcore/Benchmarks/Startup.cs
  12. 1 2
      frameworks/CSharp/aspnetcore/PlatformBenchmarks/AsciiString.cs
  13. 24 9
      frameworks/CSharp/aspnetcore/PlatformBenchmarks/BenchmarkApplication.HttpConnection.cs
  14. 4 3
      frameworks/CSharp/aspnetcore/PlatformBenchmarks/BenchmarkApplication.Json.cs
  15. 4 3
      frameworks/CSharp/aspnetcore/PlatformBenchmarks/BenchmarkApplication.MultipleQueries.cs
  16. 4 3
      frameworks/CSharp/aspnetcore/PlatformBenchmarks/BenchmarkApplication.SingleQuery.cs
  17. 4 3
      frameworks/CSharp/aspnetcore/PlatformBenchmarks/BenchmarkApplication.Updates.cs
  18. 4 0
      frameworks/CSharp/aspnetcore/PlatformBenchmarks/BenchmarkApplication.cs
  19. 21 34
      frameworks/CSharp/aspnetcore/PlatformBenchmarks/BenchmarkConfigurationHelpers.cs
  20. 1 1
      frameworks/CSharp/aspnetcore/PlatformBenchmarks/BufferExtensions.cs
  21. 1 0
      frameworks/CSharp/aspnetcore/PlatformBenchmarks/BufferWriter.cs
  22. 16 41
      frameworks/CSharp/aspnetcore/PlatformBenchmarks/Data/BatchUpdateString.cs
  23. 23 27
      frameworks/CSharp/aspnetcore/PlatformBenchmarks/Data/RawDb.cs
  24. 4 5
      frameworks/CSharp/aspnetcore/PlatformBenchmarks/DateHeader.cs
  25. 8 6
      frameworks/CSharp/aspnetcore/PlatformBenchmarks/PlatformBenchmarks.csproj
  26. 1 1
      frameworks/CSharp/aspnetcore/PlatformBenchmarks/Program.cs
  27. 1 1
      frameworks/CSharp/aspnetcore/PlatformBenchmarks/StringBuilderCache.cs
  28. 2 3
      frameworks/CSharp/aspnetcore/aspcore-ado-my.dockerfile
  29. 2 3
      frameworks/CSharp/aspnetcore/aspcore-ado-pg-up.dockerfile
  30. 2 3
      frameworks/CSharp/aspnetcore/aspcore-ado-pg.dockerfile
  31. 2 3
      frameworks/CSharp/aspnetcore/aspcore-mvc-ado-my.dockerfile
  32. 2 3
      frameworks/CSharp/aspnetcore/aspcore-mvc-ado-pg-up.dockerfile
  33. 2 3
      frameworks/CSharp/aspnetcore/aspcore-mvc-ado-pg.dockerfile
  34. 2 3
      frameworks/CSharp/aspnetcore/aspcore-mvc-dap-my.dockerfile
  35. 2 3
      frameworks/CSharp/aspnetcore/aspcore-mvc-dap-pg-up.dockerfile
  36. 2 3
      frameworks/CSharp/aspnetcore/aspcore-mvc-dap-pg.dockerfile
  37. 2 3
      frameworks/CSharp/aspnetcore/aspcore-mvc-ef-pg-up.dockerfile
  38. 2 3
      frameworks/CSharp/aspnetcore/aspcore-mvc-ef-pg.dockerfile
  39. 2 3
      frameworks/CSharp/aspnetcore/aspcore-mvc.dockerfile
  40. 2 3
      frameworks/CSharp/aspnetcore/aspcore-mw-ado-my.dockerfile
  41. 2 3
      frameworks/CSharp/aspnetcore/aspcore-mw-ado-pg-up.dockerfile
  42. 2 3
      frameworks/CSharp/aspnetcore/aspcore-mw-ado-pg.dockerfile
  43. 2 3
      frameworks/CSharp/aspnetcore/aspcore-mw-dap-my.dockerfile
  44. 2 3
      frameworks/CSharp/aspnetcore/aspcore-mw-dap-pg-up.dockerfile
  45. 2 3
      frameworks/CSharp/aspnetcore/aspcore-mw-dap-pg.dockerfile
  46. 2 3
      frameworks/CSharp/aspnetcore/aspcore-mw-ef-pg-up.dockerfile
  47. 2 3
      frameworks/CSharp/aspnetcore/aspcore-mw-ef-pg.dockerfile
  48. 2 3
      frameworks/CSharp/aspnetcore/aspcore-mw-json.dockerfile
  49. 0 12
      frameworks/CSharp/aspnetcore/aspcore-mw-spanjson.dockerfile
  50. 0 12
      frameworks/CSharp/aspnetcore/aspcore-mw-utf8json.dockerfile
  51. 2 3
      frameworks/CSharp/aspnetcore/aspcore-mw.dockerfile
  52. 2 3
      frameworks/CSharp/aspnetcore/aspcore-rhtx-pg-up.dockerfile
  53. 2 3
      frameworks/CSharp/aspnetcore/aspcore-rhtx-pg.dockerfile
  54. 2 3
      frameworks/CSharp/aspnetcore/aspcore-rhtx.dockerfile
  55. 2 3
      frameworks/CSharp/aspnetcore/aspcore.dockerfile
  56. 0 93
      frameworks/CSharp/aspnetcore/benchmark_config.json

+ 7 - 7
frameworks/CSharp/aspnetcore/Benchmarks/Benchmarks.csproj

@@ -1,6 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk.Web">
   <PropertyGroup>
-    <TargetFramework>netcoreapp2.2</TargetFramework>
+    <TargetFramework>netcoreapp3.0</TargetFramework>
+    <LangVersion>preview</LangVersion>
     <OutputType>Exe</OutputType>
   </PropertyGroup>
 
@@ -12,12 +13,11 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.AspNetCore.App" />
-    <PackageReference Include="Dapper" Version="1.50.5" />
+    <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.0.0-preview7.19365.7" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.0.0-preview7.19362.6" />
+
+    <PackageReference Include="Dapper" Version="1.60.6" />
     <PackageReference Include="MySqlConnector" Version="0.56.0" />
-    <PackageReference Include="Npgsql" Version="4.0.4" />
-    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="2.2.0" />
-    <PackageReference Include="SpanJson" Version="2.0.4" />
-    <PackageReference Include="Utf8Json" Version="1.3.7" />
+    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.0.0-preview7" />
   </ItemGroup>
 </Project>

+ 0 - 6
frameworks/CSharp/aspnetcore/Benchmarks/Configuration/Scenarios.cs

@@ -23,12 +23,6 @@ namespace Benchmarks.Configuration
         [ScenarioPath("/json")]
         public bool Json { get; set; }
 
-        [ScenarioPath("/utf8json")]
-        public bool Utf8Json { get; set; }
-
-        [ScenarioPath("/spanjson")]
-        public bool SpanJson { get; set; }
-
         [ScenarioPath("/128B.txt", "/512B.txt", "/1KB.txt", "/4KB.txt", "/16KB.txt", "/512KB.txt", "/1MB.txt", "/5MB.txt")]
         public bool StaticFiles { get; set; }
 

+ 17 - 42
frameworks/CSharp/aspnetcore/Benchmarks/Data/BatchUpdateString.cs

@@ -11,59 +11,34 @@ namespace Benchmarks.Data
     internal class BatchUpdateString
     {
         private const int MaxBatch = 500;
-        private static string[] _queries = new string[MaxBatch];
-        private static DatabaseServer _databaseServer;
 
-        public static IList<BatchUpdateString> Strings { get; } =
-            Enumerable.Range(0, MaxBatch)
-                      .Select(i => new BatchUpdateString
-                      {
-                          Id = $"Id_{i}",
-                          Random = $"Random_{i}",
-                          BatchSize = i
-                      }).ToArray();
+        private static string[] _queries = new string[MaxBatch+1];
 
-        private int BatchSize { get; set; }
-        public string Id { get; set; }
-        public string Random { get; set; }
-        public string UpdateQuery => _queries[BatchSize] ?? CreateQuery(BatchSize);
+        public static DatabaseServer DatabaseServer;
 
-        [MethodImpl(MethodImplOptions.NoInlining)]
-        private string CreateQuery(int batchSize)
+        public static string Query(int batchSize)
         {
+            if (_queries[batchSize] != null)
+            {
+                return _queries[batchSize];
+            }
+
+            var lastIndex = batchSize - 1;
+
             var sb = StringBuilderCache.Acquire();
-            if (_databaseServer == DatabaseServer.PostgreSql)
+
+            if (DatabaseServer == DatabaseServer.PostgreSql)
             {
                 sb.Append("UPDATE world SET randomNumber = temp.randomNumber FROM (VALUES ");
-                Enumerable.Range(0, batchSize).Select(i => sb.Append($"(@Id_{i}, @Random_{i}), ")).ToList();
-                sb.Append($"(@Id_{batchSize}, @Random_{batchSize}) ORDER BY 1) AS temp(id, randomNumber) WHERE temp.id = world.id");
+                Enumerable.Range(0, lastIndex).ToList().ForEach(i => sb.Append($"(@Id_{i}, @Random_{i}), "));
+                sb.Append($"(@Id_{lastIndex}, @Random_{lastIndex}) ORDER BY 1) AS temp(id, randomNumber) WHERE temp.id = world.id");
             }
             else
             {
-                foreach (var q in Enumerable.Range(0, batchSize + 1)
-                    .Select(i => $"UPDATE world SET randomnumber = @Random_{i} WHERE id = @Id_{i};"))
-                {
-                    sb.Append(q);
-                }
+                Enumerable.Range(0, batchSize).ToList().ForEach(i => sb.Append($"UPDATE world SET randomnumber = @Random_{i} WHERE id = @Id_{i};"));
             }
-            var query = sb.ToString();
-            _queries[batchSize] = query;
-            return query;
-        }
 
-        public static void Initialize(DatabaseServer databaseServer)
-        {
-            _databaseServer = databaseServer;
-            Observe(Strings[0].UpdateQuery);
-            Observe(Strings[4].UpdateQuery);
-            Observe(Strings[9].UpdateQuery);
-            Observe(Strings[14].UpdateQuery);
-            Observe(Strings[19].UpdateQuery);
-        }
-
-        [MethodImpl(MethodImplOptions.NoInlining)]
-        private static void Observe(string query)
-        {
+            return _queries[batchSize] = StringBuilderCache.GetStringAndRelease(sb);
         }
     }
-}
+}

+ 3 - 7
frameworks/CSharp/aspnetcore/Benchmarks/Data/DapperDb.cs

@@ -77,20 +77,16 @@ namespace Benchmarks.Data
                     results[i] = await ReadSingleRow(db);
                 }
 
-                // postgres has problems with deadlocks when these aren't sorted
-                Array.Sort<World>(results, WorldSortComparison);
-
                 for (int i = 0; i < count; i++)
                 {
-                    var strings = BatchUpdateString.Strings[i];
                     var randomNumber = _random.Next(1, 10001);
-                    parameters[strings.Random] = randomNumber;
-                    parameters[strings.Id] = results[i].Id;
+                    parameters[$"@Random_{i}"] = randomNumber;
+                    parameters[$"@Id_{i}"] = results[i].Id;
 
                     results[i].RandomNumber = randomNumber;
                 }
 
-                await db.ExecuteAsync(BatchUpdateString.Strings[results.Length - 1].UpdateQuery, parameters);
+                await db.ExecuteAsync(BatchUpdateString.Query(count), parameters);
                 return results;
             }
 

+ 19 - 7
frameworks/CSharp/aspnetcore/Benchmarks/Data/EfDb.cs

@@ -31,7 +31,10 @@ namespace Benchmarks.Data
         {
             var id = _random.Next(1, 10001);
 
-            return _firstWorldQuery(_dbContext, id);
+            // TODO: compiled queries are not supported in EF 3.0-preview7
+            // return _firstWorldQuery(_dbContext, id);
+            
+            return _dbContext.World.FirstAsync(w => w.Id == id);
         }
 
         public async Task<World[]> LoadMultipleQueriesRows(int count)
@@ -42,7 +45,10 @@ namespace Benchmarks.Data
             {
                 var id = _random.Next(1, 10001);
 
-                result[i] = await _firstWorldQuery(_dbContext, id);
+                // TODO: compiled queries are not supported in EF 3.0-preview7
+                // result[i] = await _firstWorldQuery(_dbContext, id);
+
+                result[i] = await _dbContext.World.FirstAsync(w => w.Id == id);
             }
 
             return result;
@@ -59,11 +65,14 @@ namespace Benchmarks.Data
             for (var i = 0; i < count; i++)
             {
                 var id = _random.Next(1, 10001);
-                var result = await _firstWorldTrackedQuery(_dbContext, id);
 
-                _dbContext.Entry(result).Property("RandomNumber").CurrentValue = _random.Next(1, 10001);
+                // TODO: compiled queries are not supported in EF 3.0-preview7
+                // var result = await _firstWorldTrackedQuery(_dbContext, id);
+
+                var result = await _dbContext.World.AsTracking().FirstAsync(w => w.Id == id);
 
-                results[i] = result;
+                _dbContext.Entry(result).Property("RandomNumber").CurrentValue = _random.Next(1, 10001);
+                results[i] = result;                
             }
 
             await _dbContext.SaveChangesAsync();
@@ -71,12 +80,15 @@ namespace Benchmarks.Data
             return results;
         }
 
-        private static readonly Func<ApplicationDbContext, AsyncEnumerable<Fortune>> _fortunesQuery
+        private static readonly Func<ApplicationDbContext, IAsyncEnumerable<Fortune>> _fortunesQuery
             = EF.CompileAsyncQuery((ApplicationDbContext context) => context.Fortune);
 
         public async Task<List<Fortune>> LoadFortunesRows()
         {
-            var result = await _fortunesQuery(_dbContext).ToListAsync();
+            var result = await _dbContext.Fortune.ToListAsync();
+
+            // TODO: compiled queries are not supported in EF 3.0-preview7
+            // await foreach (var element in _fortunesQuery(_dbContext))
 
             result.Add(new Fortune { Message = "Additional fortune added at request time." });
             result.Sort();

+ 4 - 8
frameworks/CSharp/aspnetcore/Benchmarks/Data/RawDb.cs

@@ -107,19 +107,17 @@ namespace Benchmarks.Data
                         queryCmd.Parameters["@Id"].Value = _random.Next(1, 10001);
                     }
 
-                    // Postgres has problems with deadlocks when these aren't sorted
-                    Array.Sort<World>(results, WorldSortComparison);
+                    updateCmd.CommandText = BatchUpdateString.Query(count);
 
-                    for(int i = 0; i < count; i++)
+                    for (int i = 0; i < count; i++)
                     {
-                        var strings = BatchUpdateString.Strings[i];
                         var id = updateCmd.CreateParameter();
-                        id.ParameterName = strings.Id;
+                        id.ParameterName = $"@Id_{i}";
                         id.DbType = DbType.Int32;
                         updateCmd.Parameters.Add(id);
 
                         var random = updateCmd.CreateParameter();
-                        random.ParameterName = strings.Random;
+                        random.ParameterName = $"@Random_{i}";
                         random.DbType = DbType.Int32;
                         updateCmd.Parameters.Add(random);
 
@@ -129,8 +127,6 @@ namespace Benchmarks.Data
                         results[i].RandomNumber = randomNumber;
                     }
 
-                    updateCmd.CommandText = BatchUpdateString.Strings[results.Length - 1].UpdateQuery;
-
                     await updateCmd.ExecuteNonQueryAsync();
                     return results;
                 }

+ 8 - 8
frameworks/CSharp/aspnetcore/Benchmarks/Middleware/JsonMiddleware.cs

@@ -4,18 +4,18 @@
 using System;
 using System.IO;
 using System.Text;
+using System.Text.Json;
+using System.Text.Json.Serialization;
 using System.Threading.Tasks;
 using Benchmarks.Configuration;
 using Microsoft.AspNetCore.Builder;
 using Microsoft.AspNetCore.Http;
-using Newtonsoft.Json;
 
 namespace Benchmarks.Middleware
 {
     public class JsonMiddleware
     {
         private static readonly PathString _path = new PathString(Scenarios.GetPath(s => s.Json));
-        private static readonly JsonSerializer _json = new JsonSerializer();
         private static readonly UTF8Encoding _encoding = new UTF8Encoding(false);
         private const int _bufferSize = 27;
 
@@ -34,12 +34,7 @@ namespace Benchmarks.Middleware
                 httpContext.Response.ContentType = "application/json";
                 httpContext.Response.ContentLength = _bufferSize;
 
-                using (var sw = new StreamWriter(httpContext.Response.Body, _encoding, bufferSize: _bufferSize))
-                {
-                    _json.Serialize(sw, new { message = "Hello, World!" });
-                }
-
-                return Task.CompletedTask;
+                return JsonSerializer.SerializeAsync<JsonMessage>(httpContext.Response.Body, new JsonMessage { message = "Hello, World!" });
             }
 
             return _next(httpContext);
@@ -53,4 +48,9 @@ namespace Benchmarks.Middleware
             return builder.UseMiddleware<JsonMiddleware>();
         }
     }
+
+    public struct JsonMessage
+    {
+        public string message { get; set; }
+    }
 }

+ 0 - 45
frameworks/CSharp/aspnetcore/Benchmarks/Middleware/SpanJsonMiddleware.cs

@@ -1,45 +0,0 @@
-using System;
-using System.Threading.Tasks;
-using Benchmarks.Configuration;
-using Microsoft.AspNetCore.Builder;
-using Microsoft.AspNetCore.Http;
-
-namespace Benchmarks.Middleware
-{
-    public class SpanJsonMiddleware
-    {
-        private static readonly PathString _path = new PathString(Scenarios.GetPath(s => s.SpanJson));
-        private const int _bufferSize = 27;
-
-        private readonly RequestDelegate _next;
-
-        public SpanJsonMiddleware(RequestDelegate next)
-        {
-            _next = next;
-        }
-
-        public Task Invoke(HttpContext httpContext)
-        {
-            if (httpContext.Request.Path.StartsWithSegments(_path, StringComparison.Ordinal))
-            {
-                httpContext.Response.StatusCode = 200;
-                httpContext.Response.ContentType = "application/json";
-                httpContext.Response.ContentLength = _bufferSize;
-
-                var msg = new JsonMessage { message = "Hello, World!" };
-                var result = SpanJson.JsonSerializer.Generic.Utf8.SerializeAsync(msg, httpContext.Response.Body);
-                return result.IsCompleted ? Task.CompletedTask : result.AsTask();
-            }
-
-            return _next(httpContext);
-        }
-    }
-
-    public static class SpanJsonMiddlewareExtensions
-    {
-        public static IApplicationBuilder UseSpanJson(this IApplicationBuilder builder)
-        {
-            return builder.UseMiddleware<SpanJsonMiddleware>();
-        }
-    }
-}

+ 0 - 52
frameworks/CSharp/aspnetcore/Benchmarks/Middleware/Utf8JsonMiddleware.cs

@@ -1,52 +0,0 @@
-using Benchmarks.Configuration;
-using Microsoft.AspNetCore.Builder;
-using Microsoft.AspNetCore.Http;
-using System;
-using System.Threading.Tasks;
-using Utf8Json;
-
-namespace Benchmarks.Middleware
-{
-    public struct JsonMessage
-    {
-        public string message;
-    }
-
-    public class Utf8JsonMiddleware
-    {
-        private static readonly PathString _path = new PathString(Scenarios.GetPath(s => s.Utf8Json));
-        private const int _bufferSize = 27;
-
-        private readonly RequestDelegate _next;
-
-        public Utf8JsonMiddleware(RequestDelegate next)
-        {
-            _next = next;
-        }
-
-        public Task Invoke(HttpContext httpContext)
-        {
-            if (httpContext.Request.Path.StartsWithSegments(_path, StringComparison.Ordinal))
-            {
-                httpContext.Response.StatusCode = 200;
-                httpContext.Response.ContentType = "application/json";
-                httpContext.Response.ContentLength = _bufferSize;
-
-                var msg = new JsonMessage { message = "Hello, World!" };
-                JsonSerializer.Serialize(httpContext.Response.Body, msg);
-
-                return Task.CompletedTask;
-            }
-
-            return _next(httpContext);
-        }
-    }
-
-    public static class Utf8JsonMiddlewareExtensions
-    {
-        public static IApplicationBuilder UseUtf8Json(this IApplicationBuilder builder)
-        {
-            return builder.UseMiddleware<Utf8JsonMiddleware>();
-        }
-    }
-}

+ 2 - 0
frameworks/CSharp/aspnetcore/Benchmarks/Program.cs

@@ -10,6 +10,8 @@ using Benchmarks.Configuration;
 using Microsoft.AspNetCore.Hosting;
 using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Logging;
 
 namespace Benchmarks
 {

+ 9 - 22
frameworks/CSharp/aspnetcore/Benchmarks/Startup.cs

@@ -22,7 +22,7 @@ namespace Benchmarks
 {
     public class Startup
     {
-        public Startup(IHostingEnvironment hostingEnv, Scenarios scenarios)
+        public Startup(IWebHostEnvironment hostingEnv, Scenarios scenarios)
         {
             // Set up configuration sources.
             var builder = new ConfigurationBuilder()
@@ -55,6 +55,8 @@ namespace Benchmarks
             services.AddEntityFrameworkSqlServer();
 
             var appSettings = Configuration.Get<AppSettings>();
+            BatchUpdateString.DatabaseServer = appSettings.Database;
+
             Console.WriteLine($"Database: {appSettings.Database}");
 
             if (appSettings.Database == DatabaseServer.PostgreSql)
@@ -92,11 +94,6 @@ namespace Benchmarks
                 services.AddScoped<DapperDb>();
             }
 
-            if (Scenarios.Any("Update"))
-            {
-                BatchUpdateString.Initialize(appSettings.Database);
-            }
-
             if (Scenarios.Any("Fortunes"))
             {
                 var settings = new TextEncoderSettings(UnicodeRanges.BasicLatin, UnicodeRanges.Katakana, UnicodeRanges.Hiragana);
@@ -114,11 +111,6 @@ namespace Benchmarks
                     .SetCompatibilityVersion(CompatibilityVersion.Latest)
                     ;
 
-                if (Scenarios.MvcJson || Scenarios.Any("MvcDbSingle") || Scenarios.Any("MvcDbMulti"))
-                {
-                    mvcBuilder.AddJsonFormatters();
-                }
-
                 if (Scenarios.MvcViews || Scenarios.Any("MvcDbFortunes"))
                 {
                     mvcBuilder
@@ -140,16 +132,6 @@ namespace Benchmarks
                 app.UseJson();
             }
 
-            if (Scenarios.Utf8Json)
-            {
-                app.UseUtf8Json();
-            }
-
-            if (Scenarios.SpanJson)
-            {
-                app.UseSpanJson();
-            }
-
             // Fortunes endpoints
             if (Scenarios.DbFortunesRaw)
             {
@@ -216,7 +198,12 @@ namespace Benchmarks
 
             if (Scenarios.Any("Mvc"))
             {
-                app.UseMvc();
+                app.UseRouting();
+            
+                app.UseEndpoints(endpoints =>
+                {
+                    endpoints.MapControllers();
+                });
             }
 
             if (Scenarios.StaticFiles)

+ 1 - 2
frameworks/CSharp/aspnetcore/PlatformBenchmarks/AsciiString.cs

@@ -3,7 +3,6 @@
 
 using System;
 using System.Text;
-using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
 
 namespace PlatformBenchmarks
 {
@@ -22,7 +21,7 @@ namespace PlatformBenchmarks
 
         public static implicit operator AsciiString(string str) => new AsciiString(str);
 
-        public override string ToString() => HttpUtilities.GetAsciiStringNonNullCharacters(_data);
+        public override string ToString() => Encoding.ASCII.GetString(_data);
         public static explicit operator string(AsciiString str) => str.ToString();
 
         public bool Equals(AsciiString other) => ReferenceEquals(_data, other._data) || SequenceEqual(_data, other._data);

+ 24 - 9
frameworks/CSharp/aspnetcore/PlatformBenchmarks/BenchmarkApplication.HttpConnection.cs

@@ -41,6 +41,13 @@ namespace PlatformBenchmarks
             }
         }
 
+        private static HtmlEncoder CreateHtmlEncoder()
+        {
+            var settings = new TextEncoderSettings(UnicodeRanges.BasicLatin, UnicodeRanges.Katakana, UnicodeRanges.Hiragana);
+            settings.AllowCharacter('\u2014');  // allow EM DASH through
+            return HtmlEncoder.Create(settings);
+        }
+
         private async Task ProcessRequestsAsync()
         {
             while (true)
@@ -103,10 +110,19 @@ namespace PlatformBenchmarks
 
                 if (state == State.Headers)
                 {
-                    if (Parser.ParseHeaders(new ParsingAdapter(this), buffer, out consumed, out examined, out int consumedBytes))
+                    var reader = new SequenceReader<byte>(buffer);
+                    var success = Parser.ParseHeaders(new ParsingAdapter(this), ref reader);
+
+                    consumed = reader.Position;
+                    if (success)
                     {
+                        examined = consumed;
                         state = State.Body;
                     }
+                    else
+                    {
+                        examined = buffer.End;
+                    }
 
                     buffer = buffer.Slice(consumed);
                 }
@@ -129,16 +145,13 @@ namespace PlatformBenchmarks
         {
         }
 
-        public async ValueTask OnReadCompletedAsync()
+        public void OnHeadersComplete()
         {
-            await Writer.FlushAsync();
         }
 
-        private static HtmlEncoder CreateHtmlEncoder()
+        public async ValueTask OnReadCompletedAsync()
         {
-            var settings = new TextEncoderSettings(UnicodeRanges.BasicLatin, UnicodeRanges.Katakana, UnicodeRanges.Hiragana);
-            settings.AllowCharacter('\u2014');  // allow EM DASH through
-            return HtmlEncoder.Create(settings);
+            await Writer.FlushAsync();
         }
 
         private static void ThrowUnexpectedEndOfData()
@@ -186,7 +199,9 @@ namespace PlatformBenchmarks
 
             public void OnStartLine(HttpMethod method, HttpVersion version, Span<byte> target, Span<byte> path, Span<byte> query, Span<byte> customMethod, bool pathEncoded)
                 => RequestHandler.OnStartLine(method, version, target, path, query, customMethod, pathEncoded);
+
+            public void OnHeadersComplete()
+                => RequestHandler.OnHeadersComplete();
         }
     }
-
-}
+}

+ 4 - 3
frameworks/CSharp/aspnetcore/PlatformBenchmarks/BenchmarkApplication.Json.cs

@@ -2,8 +2,9 @@
 // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
 
 using System.IO.Pipelines;
+using System.Text.Json;
+using System.Text.Json.Serialization;
 using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
-using Utf8Json;
 
 namespace PlatformBenchmarks
 {
@@ -27,8 +28,8 @@ namespace PlatformBenchmarks
 
             // Content-Length header
             writer.Write(_headerContentLength);
-            var jsonPayload = JsonSerializer.SerializeUnsafe(new JsonMessage { message = "Hello, World!" });
-            writer.WriteNumeric((uint)jsonPayload.Count);
+            var jsonPayload = JsonSerializer.SerializeToUtf8Bytes(new JsonMessage { message = "Hello, World!" }, SerializerOptions);
+            writer.WriteNumeric((uint)jsonPayload.Length);
 
             // End of headers
             writer.Write(_eoh);

+ 4 - 3
frameworks/CSharp/aspnetcore/PlatformBenchmarks/BenchmarkApplication.MultipleQueries.cs

@@ -2,9 +2,10 @@
 // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
 
 using System.IO.Pipelines;
+using System.Text.Json;
+using System.Text.Json.Serialization;
 using System.Threading.Tasks;
 using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
-using Utf8Json;
 
 namespace PlatformBenchmarks
 {
@@ -33,8 +34,8 @@ namespace PlatformBenchmarks
 
             // Content-Length header
             writer.Write(_headerContentLength);
-            var jsonPayload = JsonSerializer.SerializeUnsafe(rows);
-            writer.WriteNumeric((uint)jsonPayload.Count);
+            var jsonPayload = JsonSerializer.SerializeToUtf8Bytes(rows, SerializerOptions);
+            writer.WriteNumeric((uint)jsonPayload.Length);
 
             // End of headers
             writer.Write(_eoh);

+ 4 - 3
frameworks/CSharp/aspnetcore/PlatformBenchmarks/BenchmarkApplication.SingleQuery.cs

@@ -2,9 +2,10 @@
 // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
 
 using System.IO.Pipelines;
+using System.Text.Json;
+using System.Text.Json.Serialization;
 using System.Threading.Tasks;
 using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
-using Utf8Json;
 
 namespace PlatformBenchmarks
 {
@@ -33,8 +34,8 @@ namespace PlatformBenchmarks
 
             // Content-Length header
             writer.Write(_headerContentLength);
-            var jsonPayload = JsonSerializer.SerializeUnsafe(row);
-            writer.WriteNumeric((uint)jsonPayload.Count);
+            var jsonPayload = JsonSerializer.SerializeToUtf8Bytes(row, SerializerOptions);
+            writer.WriteNumeric((uint)jsonPayload.Length);
 
             // End of headers
             writer.Write(_eoh);

+ 4 - 3
frameworks/CSharp/aspnetcore/PlatformBenchmarks/BenchmarkApplication.Updates.cs

@@ -2,9 +2,10 @@
 // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
 
 using System.IO.Pipelines;
+using System.Text.Json;
+using System.Text.Json.Serialization;
 using System.Threading.Tasks;
 using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
-using Utf8Json;
 
 namespace PlatformBenchmarks
 {
@@ -33,8 +34,8 @@ namespace PlatformBenchmarks
 
             // Content-Length header
             writer.Write(_headerContentLength);
-            var jsonPayload = JsonSerializer.SerializeUnsafe(rows);
-            writer.WriteNumeric((uint)jsonPayload.Count);
+            var jsonPayload = JsonSerializer.SerializeToUtf8Bytes(rows, SerializerOptions);
+            writer.WriteNumeric((uint)jsonPayload.Length);
 
             // End of headers
             writer.Write(_eoh);

+ 4 - 0
frameworks/CSharp/aspnetcore/PlatformBenchmarks/BenchmarkApplication.cs

@@ -4,6 +4,8 @@
 using System;
 using System.Buffers.Text;
 using System.IO.Pipelines;
+using System.Text.Json;
+using System.Text.Json.Serialization;
 using System.Threading.Tasks;
 using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
 
@@ -26,6 +28,8 @@ namespace PlatformBenchmarks
 
         private readonly static AsciiString _plainTextBody = "Hello, World!";
 
+        private static readonly JsonSerializerOptions SerializerOptions = new JsonSerializerOptions();
+        
         private readonly static AsciiString _fortunesTableStart = "<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>";
         private readonly static AsciiString _fortunesRowStart = "<tr><td>";
         private readonly static AsciiString _fortunesColumn = "</td><td>";

+ 21 - 34
frameworks/CSharp/aspnetcore/PlatformBenchmarks/BenchmarkConfigurationHelpers.cs

@@ -3,12 +3,9 @@
 
 using System;
 using System.Net;
-using Microsoft.AspNetCore;
 using Microsoft.AspNetCore.Hosting;
-using Microsoft.AspNetCore.Server.Kestrel.Core;
-using Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.Internal;
+using Microsoft.AspNetCore.Http;
 using Microsoft.Extensions.Configuration;
-using Microsoft.Extensions.DependencyInjection;
 
 namespace PlatformBenchmarks
 {
@@ -31,17 +28,7 @@ namespace PlatformBenchmarks
                 theadCount = value;
             }
 
-            if (string.Equals(webHost, "Libuv", StringComparison.OrdinalIgnoreCase))
-            {
-                builder.UseLibuv(options =>
-                {
-                    if (theadCount.HasValue)
-                    {
-                        options.ThreadCount = theadCount.Value;
-                    }
-                });
-            }
-            else if (string.Equals(webHost, "Sockets", StringComparison.OrdinalIgnoreCase))
+            if (string.Equals(webHost, "Sockets", StringComparison.OrdinalIgnoreCase))
             {
                 builder.UseSockets(options =>
                 {
@@ -51,24 +38,24 @@ namespace PlatformBenchmarks
                     }
                 });
             }
-            else if (string.Equals(webHost, "LinuxTransport", StringComparison.OrdinalIgnoreCase))
-            {
-                builder.ConfigureServices(services =>
-                {
-                    services.Configure<KestrelServerOptions>(options =>
-                    {
-                        // Run callbacks on the transport thread
-                        options.ApplicationSchedulingMode = SchedulingMode.Inline;
-                    });
-                })
-                .UseLinuxTransport(options =>
-                {
-                    if (theadCount.HasValue)
-                    {
-                        options.ThreadCount = theadCount.Value;
-                    }
-                });
-            }
+            // else if (string.Equals(webHost, "LinuxTransport", StringComparison.OrdinalIgnoreCase))
+            // {
+            //     builder.ConfigureServices(services =>
+            //     {
+            //         services.Configure<KestrelServerOptions>(options =>
+            //         {
+            //             // Run callbacks on the transport thread
+            //             options.ApplicationSchedulingMode = SchedulingMode.Inline;
+            //         });
+            //     })
+            //     .UseLinuxTransport(options =>
+            //     {
+            //         if (theadCount.HasValue)
+            //         {
+            //             options.ThreadCount = theadCount.Value;
+            //         }
+            //     });
+            // }
 
             return builder;
         }
@@ -82,7 +69,7 @@ namespace PlatformBenchmarks
                 return new IPEndPoint(IPAddress.Loopback, 8080);
             }
 
-            var address = ServerAddress.FromUrl(url);
+            var address = BindingAddress.Parse(url);
 
             IPAddress ip;
 

+ 1 - 1
frameworks/CSharp/aspnetcore/PlatformBenchmarks/Utilities/BufferExtensions.cs → frameworks/CSharp/aspnetcore/PlatformBenchmarks/BufferExtensions.cs

@@ -42,7 +42,7 @@ namespace PlatformBenchmarks
 
             // Fast path, try copying to the available memory directly
             var advanceBy = 0;
-            fixed (byte* output = &MemoryMarshal.GetReference(span))
+            fixed (byte* output = span)
             {
                 var start = output;
                 if (number < 10 && bytesLeftInBlock >= 1)

+ 1 - 0
frameworks/CSharp/aspnetcore/PlatformBenchmarks/Utilities/BufferWriter.cs → frameworks/CSharp/aspnetcore/PlatformBenchmarks/BufferWriter.cs

@@ -21,6 +21,7 @@ namespace PlatformBenchmarks
         }
 
         public Span<byte> Span => _span;
+
         public int Buffered => _buffered;
 
         [MethodImpl(MethodImplOptions.AggressiveInlining)]

+ 16 - 41
frameworks/CSharp/aspnetcore/PlatformBenchmarks/Data/BatchUpdateString.cs

@@ -10,59 +10,34 @@ namespace PlatformBenchmarks
     internal class BatchUpdateString
     {
         private const int MaxBatch = 500;
-        private static string[] _queries = new string[MaxBatch];
-        private static DatabaseServer _databaseServer;
 
-        public static IList<BatchUpdateString> Strings { get; } =
-            Enumerable.Range(0, MaxBatch)
-                      .Select(i => new BatchUpdateString
-                      {
-                          Id = $"Id_{i}",
-                          Random = $"Random_{i}",
-                          BatchSize = i
-                      }).ToArray();
+        private static string[] _queries = new string[MaxBatch+1];
 
-        private int BatchSize { get; set; }
-        public string Id { get; set; }
-        public string Random { get; set; }
-        public string UpdateQuery => _queries[BatchSize] ?? CreateQuery(BatchSize);
+        public static DatabaseServer DatabaseServer;
 
-        [MethodImpl(MethodImplOptions.NoInlining)]
-        private string CreateQuery(int batchSize)
+        public static string Query(int batchSize)
         {
+            if (_queries[batchSize] != null)
+            {
+                return _queries[batchSize];
+            }
+
+            var lastIndex = batchSize - 1;
+
             var sb = StringBuilderCache.Acquire();
-            if (_databaseServer == DatabaseServer.PostgreSql)
+
+            if (DatabaseServer == DatabaseServer.PostgreSql)
             {
                 sb.Append("UPDATE world SET randomNumber = temp.randomNumber FROM (VALUES ");
-                Enumerable.Range(0, batchSize).Select(i => sb.Append($"(@Id_{i}, @Random_{i}), ")).ToList();
-                sb.Append($"(@Id_{batchSize}, @Random_{batchSize}) ORDER BY 1) AS temp(id, randomNumber) WHERE temp.id = world.id");
+                Enumerable.Range(0, lastIndex).ToList().ForEach(i => sb.Append($"(@Id_{i}, @Random_{i}), "));
+                sb.Append($"(@Id_{lastIndex}, @Random_{lastIndex}) ORDER BY 1) AS temp(id, randomNumber) WHERE temp.id = world.id");
             }
             else
             {
-                foreach (var q in Enumerable.Range(0, batchSize + 1)
-                    .Select(i => $"UPDATE world SET randomnumber = @Random_{i} WHERE id = @Id_{i};"))
-                {
-                    sb.Append(q);
-                }
+                Enumerable.Range(0, batchSize).ToList().ForEach(i => sb.Append($"UPDATE world SET randomnumber = @Random_{i} WHERE id = @Id_{i};"));
             }
-            var query = sb.ToString();
-            _queries[batchSize] = query;
-            return query;
-        }
 
-        public static void Initialize(DatabaseServer databaseServer)
-        {
-            _databaseServer = databaseServer;
-            Observe(Strings[0].UpdateQuery);
-            Observe(Strings[4].UpdateQuery);
-            Observe(Strings[9].UpdateQuery);
-            Observe(Strings[14].UpdateQuery);
-            Observe(Strings[19].UpdateQuery);
-        }
-
-        [MethodImpl(MethodImplOptions.NoInlining)]
-        private static void Observe(string query)
-        {
+            return _queries[batchSize] = StringBuilderCache.GetStringAndRelease(sb);
         }
     }
 }

+ 23 - 27
frameworks/CSharp/aspnetcore/PlatformBenchmarks/Data/RawDb.cs

@@ -70,29 +70,23 @@ namespace PlatformBenchmarks
 
         public async Task<World[]> LoadMultipleQueriesRows(int count)
         {
+            var result = new World[count];
+
             using (var db = _dbProviderFactory.CreateConnection())
             {
                 db.ConnectionString = _connectionString;
                 await db.OpenAsync();
-                return await LoadMultipleRows(count, db);
-            }
-
-        }
-
-        private async Task<World[]> LoadMultipleRows(int count, DbConnection db)
-        {
-            using (var cmd = CreateReadCommand(db))
-            {
-                cmd.Parameters["@Id"].Value = _random.Next(1, 10001);
-
-                var result = new World[count];
-                for (int i = 0; i < result.Length; 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);
+                    }
                 }
-                return result;
             }
+
+            return result;
         }
 
         public async Task<World[]> LoadMultipleUpdatesRows(int count)
@@ -102,23 +96,27 @@ namespace PlatformBenchmarks
                 db.ConnectionString = _connectionString;
                 await db.OpenAsync();
 
-                var results = await LoadMultipleRows(count, db);
-
-                // Postgres has problems with deadlocks when these aren't sorted
-                Array.Sort<World>(results, WorldSortComparison);
-
                 using (var updateCmd = db.CreateCommand())
+                using (var queryCmd = CreateReadCommand(db))
                 {
-                    for (int i = 0; i < results.Length; i++)
+                    var results = new World[count];
+                    for (int i = 0; i < count; i++)
+                    {
+                        results[i] = await ReadSingleRow(db, queryCmd);
+                        queryCmd.Parameters["@Id"].Value = _random.Next(1, 10001);
+                    }
+
+                    updateCmd.CommandText = BatchUpdateString.Query(count);
+
+                    for (int i = 0; i < count; i++)
                     {
-                        var strings = BatchUpdateString.Strings[i];
                         var id = updateCmd.CreateParameter();
-                        id.ParameterName = strings.Id;
+                        id.ParameterName = $"@Id_{i}";
                         id.DbType = DbType.Int32;
                         updateCmd.Parameters.Add(id);
 
                         var random = updateCmd.CreateParameter();
-                        random.ParameterName = strings.Random;
+                        random.ParameterName = $"@Random_{i}";
                         random.DbType = DbType.Int32;
                         updateCmd.Parameters.Add(random);
 
@@ -128,9 +126,7 @@ namespace PlatformBenchmarks
                         results[i].RandomNumber = randomNumber;
                     }
 
-                    updateCmd.CommandText = BatchUpdateString.Strings[results.Length - 1].UpdateQuery;
                     await updateCmd.ExecuteNonQueryAsync();
-
                     return results;
                 }
             }

+ 4 - 5
frameworks/CSharp/aspnetcore/PlatformBenchmarks/Utilities/DateHeader.cs → frameworks/CSharp/aspnetcore/PlatformBenchmarks/DateHeader.cs

@@ -1,4 +1,4 @@
-// Copyright (c) .NET Foundation. All rights reserved.
+// 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;
@@ -6,14 +6,13 @@ using System.Buffers.Text;
 using System.Diagnostics;
 using System.Text;
 using System.Threading;
-using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
 
-namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
+namespace PlatformBenchmarks
 {
     /// <summary>
     /// Manages the generation of the date header value.
     /// </summary>
-    internal static class DateHeader 
+    internal static class DateHeader
     {
         const int prefixLength = 8; // "\r\nDate: ".Length
         const int dateTimeRLength = 29; // Wed, 14 Mar 2018 14:20:00 GMT
@@ -59,4 +58,4 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
             }
         }
     }
-}
+}

+ 8 - 6
frameworks/CSharp/aspnetcore/PlatformBenchmarks/PlatformBenchmarks.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk.Web">
 
   <PropertyGroup>
-    <TargetFramework>netcoreapp2.2</TargetFramework>
+    <TargetFramework>netcoreapp3.0</TargetFramework>
     <OutputType>Exe</OutputType>
     <LangVersion>latest</LangVersion>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
@@ -12,11 +12,13 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv" Version="2.2.0" />
-    <PackageReference Include="Utf8Json" Version="1.3.7" />
-    <PackageReference Include="Npgsql" Version="4.0.4" />
+    <PackageReference Include="Npgsql" Version="4.0.8" />
     <PackageReference Include="MySqlConnector" Version="0.56.0" />
-    <PackageReference Include="RedHat.AspNetCore.Server.Kestrel.Transport.Linux" Version="2.2.0-*" />
-    <PackageReference Include="Microsoft.AspNetCore.App" />
+    <!-- <PackageReference Include="RedHat.AspNetCore.Server.Kestrel.Transport.Linux" Version="3.0.0-*" /> -->
+
+    <PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="3.0.0-preview7.19362.4" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="3.0.0-preview7.19362.4" />
+    <PackageReference Include="Microsoft.Extensions.Options" Version="3.0.0-preview7.19362.4" />
+    
   </ItemGroup>
 </Project>

+ 1 - 1
frameworks/CSharp/aspnetcore/PlatformBenchmarks/Program.cs

@@ -30,7 +30,7 @@ namespace PlatformBenchmarks
 
             var host = BuildWebHost(args);
             var config = (IConfiguration)host.Services.GetService(typeof(IConfiguration));
-            BatchUpdateString.Initialize(config.Get<AppSettings>().Database);
+            BatchUpdateString.DatabaseServer = config.Get<AppSettings>().Database;
             host.Run();
         }
 

+ 1 - 1
frameworks/CSharp/aspnetcore/PlatformBenchmarks/Utilities/StringBuilderCache.cs → frameworks/CSharp/aspnetcore/PlatformBenchmarks/StringBuilderCache.cs

@@ -1,4 +1,4 @@
-// Copyright (c) .NET Foundation. All rights reserved. 
+// 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;

+ 2 - 3
frameworks/CSharp/aspnetcore/aspcore-ado-my.dockerfile

@@ -1,11 +1,10 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
+FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
 WORKDIR /app
 COPY PlatformBenchmarks .
 RUN dotnet publish -c Release -o out
 
-FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
+FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
 ENV ASPNETCORE_URLS http://+:8080
-ENV COMPlus_ReadyToRun 0
 WORKDIR /app
 COPY --from=build /app/out ./
 COPY Benchmarks/appsettings.mysql.json ./appsettings.json

+ 2 - 3
frameworks/CSharp/aspnetcore/aspcore-ado-pg-up.dockerfile

@@ -1,11 +1,10 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
+FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
 WORKDIR /app
 COPY PlatformBenchmarks .
 RUN dotnet publish -c Release -o out
 
-FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
+FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
 ENV ASPNETCORE_URLS http://+:8080
-ENV COMPlus_ReadyToRun 0
 WORKDIR /app
 COPY --from=build /app/out ./
 COPY Benchmarks/appsettings.postgresql.updates.json ./appsettings.json

+ 2 - 3
frameworks/CSharp/aspnetcore/aspcore-ado-pg.dockerfile

@@ -1,11 +1,10 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
+FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
 WORKDIR /app
 COPY PlatformBenchmarks .
 RUN dotnet publish -c Release -o out
 
-FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
+FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
 ENV ASPNETCORE_URLS http://+:8080
-ENV COMPlus_ReadyToRun 0
 WORKDIR /app
 COPY --from=build /app/out ./
 COPY Benchmarks/appsettings.postgresql.json ./appsettings.json

+ 2 - 3
frameworks/CSharp/aspnetcore/aspcore-mvc-ado-my.dockerfile

@@ -1,11 +1,10 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
+FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
 WORKDIR /app
 COPY Benchmarks .
 RUN dotnet publish -c Release -o out
 
-FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
+FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
 ENV ASPNETCORE_URLS http://+:8080
-ENV COMPlus_ReadyToRun 0
 WORKDIR /app
 COPY --from=build /app/out ./
 COPY Benchmarks/appsettings.mysql.json ./appsettings.json

+ 2 - 3
frameworks/CSharp/aspnetcore/aspcore-mvc-ado-pg-up.dockerfile

@@ -1,11 +1,10 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
+FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
 WORKDIR /app
 COPY Benchmarks .
 RUN dotnet publish -c Release -o out
 
-FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
+FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
 ENV ASPNETCORE_URLS http://+:8080
-ENV COMPlus_ReadyToRun 0
 WORKDIR /app
 COPY --from=build /app/out ./
 COPY Benchmarks/appsettings.postgresql.updates.json ./appsettings.json

+ 2 - 3
frameworks/CSharp/aspnetcore/aspcore-mvc-ado-pg.dockerfile

@@ -1,11 +1,10 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
+FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
 WORKDIR /app
 COPY Benchmarks .
 RUN dotnet publish -c Release -o out
 
-FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
+FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
 ENV ASPNETCORE_URLS http://+:8080
-ENV COMPlus_ReadyToRun 0
 WORKDIR /app
 COPY --from=build /app/out ./
 COPY Benchmarks/appsettings.postgresql.json ./appsettings.json

+ 2 - 3
frameworks/CSharp/aspnetcore/aspcore-mvc-dap-my.dockerfile

@@ -1,11 +1,10 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
+FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
 WORKDIR /app
 COPY Benchmarks .
 RUN dotnet publish -c Release -o out
 
-FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
+FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
 ENV ASPNETCORE_URLS http://+:8080
-ENV COMPlus_ReadyToRun 0
 WORKDIR /app
 COPY --from=build /app/out ./
 COPY Benchmarks/appsettings.mysql.json ./appsettings.json

+ 2 - 3
frameworks/CSharp/aspnetcore/aspcore-mvc-dap-pg-up.dockerfile

@@ -1,11 +1,10 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
+FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
 WORKDIR /app
 COPY Benchmarks .
 RUN dotnet publish -c Release -o out
 
-FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
+FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
 ENV ASPNETCORE_URLS http://+:8080
-ENV COMPlus_ReadyToRun 0
 WORKDIR /app
 COPY --from=build /app/out ./
 COPY Benchmarks/appsettings.postgresql.updates.json ./appsettings.json

+ 2 - 3
frameworks/CSharp/aspnetcore/aspcore-mvc-dap-pg.dockerfile

@@ -1,11 +1,10 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
+FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
 WORKDIR /app
 COPY Benchmarks .
 RUN dotnet publish -c Release -o out
 
-FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
+FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
 ENV ASPNETCORE_URLS http://+:8080
-ENV COMPlus_ReadyToRun 0
 WORKDIR /app
 COPY --from=build /app/out ./
 COPY Benchmarks/appsettings.postgresql.json ./appsettings.json

+ 2 - 3
frameworks/CSharp/aspnetcore/aspcore-mvc-ef-pg-up.dockerfile

@@ -1,11 +1,10 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
+FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
 WORKDIR /app
 COPY Benchmarks .
 RUN dotnet publish -c Release -o out
 
-FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
+FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
 ENV ASPNETCORE_URLS http://+:8080
-ENV COMPlus_ReadyToRun 0
 WORKDIR /app
 COPY --from=build /app/out ./
 COPY Benchmarks/appsettings.postgresql.updates.json ./appsettings.json

+ 2 - 3
frameworks/CSharp/aspnetcore/aspcore-mvc-ef-pg.dockerfile

@@ -1,11 +1,10 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
+FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
 WORKDIR /app
 COPY Benchmarks .
 RUN dotnet publish -c Release -o out
 
-FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
+FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
 ENV ASPNETCORE_URLS http://+:8080
-ENV COMPlus_ReadyToRun 0
 WORKDIR /app
 COPY --from=build /app/out ./
 COPY Benchmarks/appsettings.postgresql.json ./appsettings.json

+ 2 - 3
frameworks/CSharp/aspnetcore/aspcore-mvc.dockerfile

@@ -1,11 +1,10 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
+FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
 WORKDIR /app
 COPY Benchmarks .
 RUN dotnet publish -c Release -o out
 
-FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
+FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
 ENV ASPNETCORE_URLS http://+:8080
-ENV COMPlus_ReadyToRun 0
 WORKDIR /app
 COPY --from=build /app/out ./
 

+ 2 - 3
frameworks/CSharp/aspnetcore/aspcore-mw-ado-my.dockerfile

@@ -1,11 +1,10 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
+FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
 WORKDIR /app
 COPY Benchmarks .
 RUN dotnet publish -c Release -o out
 
-FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
+FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
 ENV ASPNETCORE_URLS http://+:8080
-ENV COMPlus_ReadyToRun 0
 WORKDIR /app
 COPY --from=build /app/out ./
 COPY Benchmarks/appsettings.mysql.json ./appsettings.json

+ 2 - 3
frameworks/CSharp/aspnetcore/aspcore-mw-ado-pg-up.dockerfile

@@ -1,11 +1,10 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
+FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
 WORKDIR /app
 COPY Benchmarks .
 RUN dotnet publish -c Release -o out
 
-FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
+FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
 ENV ASPNETCORE_URLS http://+:8080
-ENV COMPlus_ReadyToRun 0
 WORKDIR /app
 COPY --from=build /app/out ./
 COPY Benchmarks/appsettings.postgresql.updates.json ./appsettings.json

+ 2 - 3
frameworks/CSharp/aspnetcore/aspcore-mw-ado-pg.dockerfile

@@ -1,11 +1,10 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
+FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
 WORKDIR /app
 COPY Benchmarks .
 RUN dotnet publish -c Release -o out
 
-FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
+FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
 ENV ASPNETCORE_URLS http://+:8080
-ENV COMPlus_ReadyToRun 0
 WORKDIR /app
 COPY --from=build /app/out ./
 COPY Benchmarks/appsettings.postgresql.json ./appsettings.json

+ 2 - 3
frameworks/CSharp/aspnetcore/aspcore-mw-dap-my.dockerfile

@@ -1,11 +1,10 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
+FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
 WORKDIR /app
 COPY Benchmarks .
 RUN dotnet publish -c Release -o out
 
-FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
+FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
 ENV ASPNETCORE_URLS http://+:8080
-ENV COMPlus_ReadyToRun 0
 WORKDIR /app
 COPY --from=build /app/out ./
 COPY Benchmarks/appsettings.mysql.json ./appsettings.json

+ 2 - 3
frameworks/CSharp/aspnetcore/aspcore-mw-dap-pg-up.dockerfile

@@ -1,11 +1,10 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
+FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
 WORKDIR /app
 COPY Benchmarks .
 RUN dotnet publish -c Release -o out
 
-FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
+FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
 ENV ASPNETCORE_URLS http://+:8080
-ENV COMPlus_ReadyToRun 0
 WORKDIR /app
 COPY --from=build /app/out ./
 COPY Benchmarks/appsettings.postgresql.updates.json ./appsettings.json

+ 2 - 3
frameworks/CSharp/aspnetcore/aspcore-mw-dap-pg.dockerfile

@@ -1,11 +1,10 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
+FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
 WORKDIR /app
 COPY Benchmarks .
 RUN dotnet publish -c Release -o out
 
-FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
+FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
 ENV ASPNETCORE_URLS http://+:8080
-ENV COMPlus_ReadyToRun 0
 WORKDIR /app
 COPY --from=build /app/out ./
 COPY Benchmarks/appsettings.postgresql.json ./appsettings.json

+ 2 - 3
frameworks/CSharp/aspnetcore/aspcore-mw-ef-pg-up.dockerfile

@@ -1,11 +1,10 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
+FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
 WORKDIR /app
 COPY Benchmarks .
 RUN dotnet publish -c Release -o out
 
-FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
+FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
 ENV ASPNETCORE_URLS http://+:8080
-ENV COMPlus_ReadyToRun 0
 WORKDIR /app
 COPY --from=build /app/out ./
 COPY Benchmarks/appsettings.postgresql.updates.json ./appsettings.json

+ 2 - 3
frameworks/CSharp/aspnetcore/aspcore-mw-ef-pg.dockerfile

@@ -1,11 +1,10 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
+FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
 WORKDIR /app
 COPY Benchmarks .
 RUN dotnet publish -c Release -o out
 
-FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
+FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
 ENV ASPNETCORE_URLS http://+:8080
-ENV COMPlus_ReadyToRun 0
 WORKDIR /app
 COPY --from=build /app/out ./
 COPY Benchmarks/appsettings.postgresql.json ./appsettings.json

+ 2 - 3
frameworks/CSharp/aspnetcore/aspcore-mw-json.dockerfile

@@ -1,11 +1,10 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
+FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
 WORKDIR /app
 COPY Benchmarks .
 RUN dotnet publish -c Release -o out
 
-FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
+FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
 ENV ASPNETCORE_URLS http://+:8080
-ENV COMPlus_ReadyToRun 0
 WORKDIR /app
 COPY --from=build /app/out ./
 

+ 0 - 12
frameworks/CSharp/aspnetcore/aspcore-mw-spanjson.dockerfile

@@ -1,12 +0,0 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
-WORKDIR /app
-COPY Benchmarks .
-RUN dotnet publish -c Release -o out
-
-FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
-ENV ASPNETCORE_URLS http://+:8080
-ENV COMPlus_ReadyToRun 0
-WORKDIR /app
-COPY --from=build /app/out ./
-
-ENTRYPOINT ["dotnet", "Benchmarks.dll", "scenarios=SpanJson"]

+ 0 - 12
frameworks/CSharp/aspnetcore/aspcore-mw-utf8json.dockerfile

@@ -1,12 +0,0 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
-WORKDIR /app
-COPY Benchmarks .
-RUN dotnet publish -c Release -o out
-
-FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
-ENV ASPNETCORE_URLS http://+:8080
-ENV COMPlus_ReadyToRun 0
-WORKDIR /app
-COPY --from=build /app/out ./
-
-ENTRYPOINT ["dotnet", "Benchmarks.dll", "scenarios=Utf8Json"]

+ 2 - 3
frameworks/CSharp/aspnetcore/aspcore-mw.dockerfile

@@ -1,11 +1,10 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
+FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
 WORKDIR /app
 COPY Benchmarks .
 RUN dotnet publish -c Release -o out
 
-FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
+FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
 ENV ASPNETCORE_URLS http://+:8080
-ENV COMPlus_ReadyToRun 0
 WORKDIR /app
 COPY --from=build /app/out ./
 

+ 2 - 3
frameworks/CSharp/aspnetcore/aspcore-rhtx-pg-up.dockerfile

@@ -1,11 +1,10 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
+FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
 WORKDIR /app
 COPY PlatformBenchmarks .
 RUN dotnet publish -c Release -o out
 
-FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
+FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
 ENV ASPNETCORE_URLS http://+:8080
-ENV COMPlus_ReadyToRun 0
 WORKDIR /app
 COPY --from=build /app/out ./
 COPY Benchmarks/appsettings.postgresql.updates.json ./appsettings.json

+ 2 - 3
frameworks/CSharp/aspnetcore/aspcore-rhtx-pg.dockerfile

@@ -1,11 +1,10 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
+FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
 WORKDIR /app
 COPY PlatformBenchmarks .
 RUN dotnet publish -c Release -o out
 
-FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
+FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
 ENV ASPNETCORE_URLS http://+:8080
-ENV COMPlus_ReadyToRun 0
 WORKDIR /app
 COPY --from=build /app/out ./
 COPY Benchmarks/appsettings.postgresql.json ./appsettings.json

+ 2 - 3
frameworks/CSharp/aspnetcore/aspcore-rhtx.dockerfile

@@ -1,11 +1,10 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
+FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
 WORKDIR /app
 COPY PlatformBenchmarks .
 RUN dotnet publish -c Release -o out
 
-FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
+FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
 ENV ASPNETCORE_URLS http://+:8080
-ENV COMPlus_ReadyToRun 0
 WORKDIR /app
 COPY --from=build /app/out ./
 COPY Benchmarks/appsettings.json ./appsettings.json

+ 2 - 3
frameworks/CSharp/aspnetcore/aspcore.dockerfile

@@ -1,11 +1,10 @@
-FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
+FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
 WORKDIR /app
 COPY PlatformBenchmarks .
 RUN dotnet publish -c Release -o out
 
-FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
+FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
 ENV ASPNETCORE_URLS http://+:8080
-ENV COMPlus_ReadyToRun 0
 WORKDIR /app
 COPY --from=build /app/out ./
 COPY Benchmarks/appsettings.json ./appsettings.json

+ 0 - 93
frameworks/CSharp/aspnetcore/benchmark_config.json

@@ -20,25 +20,6 @@
       "notes": "",
       "versus": "aspcore"
     },
-    "rhtx": {
-      "plaintext_url": "/plaintext",
-      "json_url": "/json",
-      "port": 8080,
-      "approach": "Realistic",
-      "classification": "Platform",
-      "database": "None",
-      "framework": "ASP.NET Core",
-      "language": "C#",
-      "orm": "Raw",
-      "platform": ".NET",
-      "flavor": "CoreCLR",
-      "webserver": "Kestrel",
-      "os": "Linux",
-      "database_os": "Linux",
-      "display_name": "ASP.NET Core, Red Hat Linux Transport",
-      "notes": "",
-      "versus": "aspcore"
-    },
     "ado-pg": {
       "fortune_url": "/fortunes",
       "db_url": "/db",
@@ -77,44 +58,6 @@
       "notes": "",
       "versus": "aspcore-ado-pg-up"
     },
-    "rhtx-pg": {
-      "fortune_url": "/fortunes",
-      "db_url": "/db",
-      "query_url": "/queries/queries=",
-      "port": 8080,
-      "approach": "Realistic",
-      "classification": "Platform",
-      "database": "Postgres",
-      "framework": "ASP.NET Core",
-      "language": "C#",
-      "orm": "Raw",
-      "platform": ".NET",
-      "flavor": "CoreCLR",
-      "webserver": "Kestrel",
-      "os": "Linux",
-      "database_os": "Linux",
-      "display_name": "ASP.NET Core, Red Hat Linux Transport, ADO.NET",
-      "notes": "",
-      "versus": "aspcore-ado-pg"
-    },
-    "rhtx-pg-up": {
-      "update_url": "/updates/queries=",
-      "port": 8080,
-      "approach": "Realistic",
-      "classification": "Platform",
-      "database": "Postgres",
-      "framework": "ASP.NET Core",
-      "language": "C#",
-      "orm": "Raw",
-      "platform": ".NET",
-      "flavor": "CoreCLR",
-      "webserver": "Kestrel",
-      "os": "Linux",
-      "database_os": "Linux",
-      "display_name": "ASP.NET Core, Red Hat Linux Transport, ADO.NET",
-      "notes": "",
-      "versus": "aspcore-ado-pg-up"
-    },
     "ado-my": {
       "fortune_url": "/fortunes",
       "db_url": "/db",
@@ -172,42 +115,6 @@
       "notes": "",
       "versus": "aspcore"
     },
-    "mw-utf8json": {
-      "json_url": "/utf8json",
-      "port": 8080,
-      "approach": "Realistic",
-      "classification": "Micro",
-      "database": "None",
-      "framework": "ASP.NET Core",
-      "language": "C#",
-      "orm": "Raw",
-      "platform": ".NET",
-      "flavor": "CoreCLR",
-      "webserver": "Kestrel",
-      "os": "Linux",
-      "database_os": "Linux",
-      "display_name": "ASP.NET Core, Middleware, Utf8Json",
-      "notes": "",
-      "versus": "aspcore"
-    },
-    "mw-spanjson": {
-      "json_url": "/spanjson",
-      "port": 8080,
-      "approach": "Realistic",
-      "classification": "Micro",
-      "database": "None",
-      "framework": "ASP.NET Core",
-      "language": "C#",
-      "orm": "Raw",
-      "platform": ".NET",
-      "flavor": "CoreCLR",
-      "webserver": "Kestrel",
-      "os": "Linux",
-      "database_os": "Linux",
-      "display_name": "ASP.NET Core, Middleware, SpanJson",
-      "notes": "",
-      "versus": "aspcore"
-    },
     "mw-ado-pg": {
       "db_url": "/db/raw",
       "query_url": "/queries/raw?queries=",