From 74161346aac5d1387c53c5774606d3234b39a5a8 Mon Sep 17 00:00:00 2001 From: cdincer Date: Mon, 7 Sep 2026 18:00:24 +0300 Subject: [PATCH 1/4] Basic project with a functioning scenarion. Adding this base to built out from. --- scenarios/rewrite.benchmarks.yml | 41 +++++++++++++++++++ src/BenchmarksApps.sln | 14 ++++++- src/BenchmarksApps/Rewrite/Program.cs | 32 +++++++++++++++ .../Rewrite/Properties/launchSettings.json | 12 ++++++ src/BenchmarksApps/Rewrite/Rewrite.csproj | 9 ++++ .../Rewrite/appsettings.Development.json | 8 ++++ src/BenchmarksApps/Rewrite/appsettings.json | 16 ++++++++ 7 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 scenarios/rewrite.benchmarks.yml create mode 100644 src/BenchmarksApps/Rewrite/Program.cs create mode 100644 src/BenchmarksApps/Rewrite/Properties/launchSettings.json create mode 100644 src/BenchmarksApps/Rewrite/Rewrite.csproj create mode 100644 src/BenchmarksApps/Rewrite/appsettings.Development.json create mode 100644 src/BenchmarksApps/Rewrite/appsettings.json diff --git a/scenarios/rewrite.benchmarks.yml b/scenarios/rewrite.benchmarks.yml new file mode 100644 index 000000000..46d108e5e --- /dev/null +++ b/scenarios/rewrite.benchmarks.yml @@ -0,0 +1,41 @@ +imports: + - https://raw.githubusercontent.com/dotnet/crank/main/src/Microsoft.Crank.Jobs.Wrk/wrk.yml + - https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/aspnet.profiles.yml + +variables: + serverPort: 5000 + serverScheme: http + scenario: antiforgery + debug: false + +jobs: + antiforgerybenchmarks: + source: + #repository: https://github.com/cdincer/Benchmarks.git + localFolder: ../ + branchOrCommit: main + project: src/BenchmarksApps/Rewrite/Rewrite.csproj + readyStateText: Application started. + arguments: "--urls {{serverScheme}}://{{serverAddress}}:{{serverPort}} --scenario {{scenario}} --debug {{debug}}" + +scenarios: + + rewrite1: + application: + job: antiforgerybenchmarks + variables: + scenario: antiforgery + load: + job: wrk + variables: + path: /rewrite1 + + antiforgery-generation: + application: + job: antiforgerybenchmarks + variables: + scenario: antiforgery + load: + job: wrk + variables: + path: /auth \ No newline at end of file diff --git a/src/BenchmarksApps.sln b/src/BenchmarksApps.sln index c10baaabc..91251d250 100644 --- a/src/BenchmarksApps.sln +++ b/src/BenchmarksApps.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.6.33416.333 +# Visual Studio Version 18 +VisualStudioVersion = 18.10.12120.281 insiders MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BasicMinimalApi", "BenchmarksApps\BasicMinimalApi\BasicMinimalApi.csproj", "{D13E5EF8-8DA6-4904-891D-1A8D8AAC04DD}" EndProject @@ -72,6 +72,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HttpSys", "BenchmarksApps\T EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Kestrel", "BenchmarksApps\TLS\Kestrel\Kestrel.csproj", "{291DCDF7-4B7C-D687-A62B-9DF7DF50F2F2}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rewrite", "BenchmarksApps\Rewrite\Rewrite.csproj", "{DDCACECC-62BD-4DE3-AB17-E0A66B25F591}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug_Database|Any CPU = Debug_Database|Any CPU @@ -280,6 +282,14 @@ Global {291DCDF7-4B7C-D687-A62B-9DF7DF50F2F2}.Release_Database|Any CPU.Build.0 = Release_Database|Any CPU {291DCDF7-4B7C-D687-A62B-9DF7DF50F2F2}.Release|Any CPU.ActiveCfg = Release|Any CPU {291DCDF7-4B7C-D687-A62B-9DF7DF50F2F2}.Release|Any CPU.Build.0 = Release|Any CPU + {DDCACECC-62BD-4DE3-AB17-E0A66B25F591}.Debug_Database|Any CPU.ActiveCfg = Debug_Database|Any CPU + {DDCACECC-62BD-4DE3-AB17-E0A66B25F591}.Debug_Database|Any CPU.Build.0 = Debug_Database|Any CPU + {DDCACECC-62BD-4DE3-AB17-E0A66B25F591}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DDCACECC-62BD-4DE3-AB17-E0A66B25F591}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DDCACECC-62BD-4DE3-AB17-E0A66B25F591}.Release_Database|Any CPU.ActiveCfg = Release_Database|Any CPU + {DDCACECC-62BD-4DE3-AB17-E0A66B25F591}.Release_Database|Any CPU.Build.0 = Release_Database|Any CPU + {DDCACECC-62BD-4DE3-AB17-E0A66B25F591}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DDCACECC-62BD-4DE3-AB17-E0A66B25F591}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/BenchmarksApps/Rewrite/Program.cs b/src/BenchmarksApps/Rewrite/Program.cs new file mode 100644 index 000000000..12a78dbc6 --- /dev/null +++ b/src/BenchmarksApps/Rewrite/Program.cs @@ -0,0 +1,32 @@ +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. + +var app = builder.Build(); + +// Configure the HTTP request pipeline. + +var summaries = new[] +{ + "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" +}; + +app.MapGet("/rewrite1", () => +{ + var forecast = Enumerable.Range(1, 5).Select(index => + new WeatherForecast + ( + DateOnly.FromDateTime(DateTime.Now.AddDays(index)), + Random.Shared.Next(-20, 55), + summaries[Random.Shared.Next(summaries.Length)] + )) + .ToArray(); + return forecast; +}); + +app.Run(); + +internal record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary) +{ + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); +} diff --git a/src/BenchmarksApps/Rewrite/Properties/launchSettings.json b/src/BenchmarksApps/Rewrite/Properties/launchSettings.json new file mode 100644 index 000000000..3b2a373ae --- /dev/null +++ b/src/BenchmarksApps/Rewrite/Properties/launchSettings.json @@ -0,0 +1,12 @@ +{ + "profiles": { + "Rewrite": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:55471;http://localhost:55472" + } + } +} \ No newline at end of file diff --git a/src/BenchmarksApps/Rewrite/Rewrite.csproj b/src/BenchmarksApps/Rewrite/Rewrite.csproj new file mode 100644 index 000000000..1b28a01c8 --- /dev/null +++ b/src/BenchmarksApps/Rewrite/Rewrite.csproj @@ -0,0 +1,9 @@ + + + + net8.0 + enable + enable + + + diff --git a/src/BenchmarksApps/Rewrite/appsettings.Development.json b/src/BenchmarksApps/Rewrite/appsettings.Development.json new file mode 100644 index 000000000..0c208ae91 --- /dev/null +++ b/src/BenchmarksApps/Rewrite/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/src/BenchmarksApps/Rewrite/appsettings.json b/src/BenchmarksApps/Rewrite/appsettings.json new file mode 100644 index 000000000..47d300e4d --- /dev/null +++ b/src/BenchmarksApps/Rewrite/appsettings.json @@ -0,0 +1,16 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning", + "Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware": "Information" + }, + "Console": { + "FormatterOptions": { + "TimestampFormat": "HH:mm:ss " + + } + } + }, + "AllowedHosts": "*" +} \ No newline at end of file From 522671171ef60a0e2268e934541f1b5567bbe967 Mon Sep 17 00:00:00 2001 From: cdincer Date: Tue, 8 Sep 2026 14:57:38 +0300 Subject: [PATCH 2/4] Added database to scenario, started the connection settings/arguments skeleton --- scenarios/rewrite.benchmarks.yml | 28 ++++++++++++++----- .../Rewrite/Configuration/AppSettings.cs | 8 ++++++ .../Rewrite/Configuration/ConsoleArgs.cs | 12 ++++++++ src/BenchmarksApps/Rewrite/Program.cs | 4 +++ src/BenchmarksApps/Rewrite/appsettings.json | 16 ++--------- 5 files changed, 47 insertions(+), 21 deletions(-) create mode 100644 src/BenchmarksApps/Rewrite/Configuration/AppSettings.cs create mode 100644 src/BenchmarksApps/Rewrite/Configuration/ConsoleArgs.cs diff --git a/scenarios/rewrite.benchmarks.yml b/scenarios/rewrite.benchmarks.yml index 46d108e5e..37af9b1a4 100644 --- a/scenarios/rewrite.benchmarks.yml +++ b/scenarios/rewrite.benchmarks.yml @@ -9,7 +9,7 @@ variables: debug: false jobs: - antiforgerybenchmarks: + rewritebenchmarks: source: #repository: https://github.com/cdincer/Benchmarks.git localFolder: ../ @@ -17,25 +17,39 @@ jobs: project: src/BenchmarksApps/Rewrite/Rewrite.csproj readyStateText: Application started. arguments: "--urls {{serverScheme}}://{{serverAddress}}:{{serverPort}} --scenario {{scenario}} --debug {{debug}}" + environmentVariables: + database: PostgresQL + connectionString: Server={{databaseServer}};Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=256;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4 + + mssql: + source: + #repository: https://github.com/aspnet/benchmarks.git + branchOrCommit: main + localFolder: ../docker/mssql-techempower + dockerFile: Dockerfile + readyStateText: Data imported + noClean: true scenarios: rewrite1: + db: + job: mssql application: - job: antiforgerybenchmarks + job: rewritebenchmarks variables: - scenario: antiforgery + scenario: rewrite load: job: wrk variables: path: /rewrite1 - antiforgery-generation: + rewrite2: application: - job: antiforgerybenchmarks + job: rewritebenchmarks variables: - scenario: antiforgery + scenario: rewrite load: job: wrk variables: - path: /auth \ No newline at end of file + path: /placeholder \ No newline at end of file diff --git a/src/BenchmarksApps/Rewrite/Configuration/AppSettings.cs b/src/BenchmarksApps/Rewrite/Configuration/AppSettings.cs new file mode 100644 index 000000000..e5452bd6e --- /dev/null +++ b/src/BenchmarksApps/Rewrite/Configuration/AppSettings.cs @@ -0,0 +1,8 @@ +namespace Rewrite.Configuration +{ + public class AppSettings + { + public string ConnectionString { get; set; } + + } +} diff --git a/src/BenchmarksApps/Rewrite/Configuration/ConsoleArgs.cs b/src/BenchmarksApps/Rewrite/Configuration/ConsoleArgs.cs new file mode 100644 index 000000000..00e72b86c --- /dev/null +++ b/src/BenchmarksApps/Rewrite/Configuration/ConsoleArgs.cs @@ -0,0 +1,12 @@ +namespace Rewrite.Configuration +{ + public class ConsoleArgs + { + public ConsoleArgs(string[] args) + { + Args = args; + } + + public string[] Args { get; } + } +} diff --git a/src/BenchmarksApps/Rewrite/Program.cs b/src/BenchmarksApps/Rewrite/Program.cs index 12a78dbc6..6d3419f2b 100644 --- a/src/BenchmarksApps/Rewrite/Program.cs +++ b/src/BenchmarksApps/Rewrite/Program.cs @@ -1,5 +1,9 @@ var builder = WebApplication.CreateBuilder(args); +foreach(string item in args) +{ + Console.WriteLine(item); +} // Add services to the container. var app = builder.Build(); diff --git a/src/BenchmarksApps/Rewrite/appsettings.json b/src/BenchmarksApps/Rewrite/appsettings.json index 47d300e4d..3b347d075 100644 --- a/src/BenchmarksApps/Rewrite/appsettings.json +++ b/src/BenchmarksApps/Rewrite/appsettings.json @@ -1,16 +1,4 @@ { - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning", - "Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware": "Information" - }, - "Console": { - "FormatterOptions": { - "TimestampFormat": "HH:mm:ss " - - } - } - }, - "AllowedHosts": "*" + "ConnectionString": "", + "DatabaseServer": "Sqlite" } \ No newline at end of file From 5163709e9fef082b8d0f6353b795032678d52ecd Mon Sep 17 00:00:00 2001 From: cdincer Date: Tue, 8 Sep 2026 17:49:50 +0300 Subject: [PATCH 3/4] Connection to DB established switching from network host mode to normal mapping ports, for the development, duration it will be kept like this --- docker/postgres-techempower/run.sh | 2 +- scenarios/rewrite.benchmarks.yml | 14 ++++- .../Rewrite/Data/ApplicationDbContext.cs | 17 ++++++ src/BenchmarksApps/Rewrite/Data/EfDb.cs | 43 +++++++++++++++ src/BenchmarksApps/Rewrite/Data/Fortune.cs | 33 ++++++++++++ src/BenchmarksApps/Rewrite/Data/IDb.cs | 7 +++ src/BenchmarksApps/Rewrite/Program.cs | 54 ++++++++++++++++--- src/BenchmarksApps/Rewrite/Rewrite.csproj | 11 +++- src/BenchmarksApps/Rewrite/appsettings.json | 16 +++++- 9 files changed, 184 insertions(+), 13 deletions(-) create mode 100644 src/BenchmarksApps/Rewrite/Data/ApplicationDbContext.cs create mode 100644 src/BenchmarksApps/Rewrite/Data/EfDb.cs create mode 100644 src/BenchmarksApps/Rewrite/Data/Fortune.cs create mode 100644 src/BenchmarksApps/Rewrite/Data/IDb.cs diff --git a/docker/postgres-techempower/run.sh b/docker/postgres-techempower/run.sh index 9c87df650..04d29eb5d 100755 --- a/docker/postgres-techempower/run.sh +++ b/docker/postgres-techempower/run.sh @@ -8,6 +8,6 @@ docker run \ --log-opt max-size=10m \ --log-opt max-file=3 \ --name postgres-techempower \ - --network host \ + -p 5432:5432 \ --restart always \ postgres-techempower diff --git a/scenarios/rewrite.benchmarks.yml b/scenarios/rewrite.benchmarks.yml index 37af9b1a4..f7cf243b1 100644 --- a/scenarios/rewrite.benchmarks.yml +++ b/scenarios/rewrite.benchmarks.yml @@ -30,11 +30,21 @@ jobs: readyStateText: Data imported noClean: true + postgresql: + source: + #repository: https://github.com/TechEmpower/FrameworkBenchmarks.git + branchOrCommit: master + localFolder: ../docker/postgres-techempower + dockerFile: Dockerfile + readyStateText: ready to accept connections + noClean: true + + scenarios: rewrite1: db: - job: mssql + job: postgresql application: job: rewritebenchmarks variables: @@ -52,4 +62,4 @@ scenarios: load: job: wrk variables: - path: /placeholder \ No newline at end of file + path: /rewrite1 \ No newline at end of file diff --git a/src/BenchmarksApps/Rewrite/Data/ApplicationDbContext.cs b/src/BenchmarksApps/Rewrite/Data/ApplicationDbContext.cs new file mode 100644 index 000000000..f14616cbf --- /dev/null +++ b/src/BenchmarksApps/Rewrite/Data/ApplicationDbContext.cs @@ -0,0 +1,17 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.ChangeTracking; + +namespace Rewrite.Data +{ + public class ApplicationDbContext : DbContext + { + public ApplicationDbContext(DbContextOptions options) + : base(options) + { + ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; + ChangeTracker.AutoDetectChangesEnabled = false; + } + public DbSet Fortune { get; set; } + + } +} diff --git a/src/BenchmarksApps/Rewrite/Data/EfDb.cs b/src/BenchmarksApps/Rewrite/Data/EfDb.cs new file mode 100644 index 000000000..5063289d7 --- /dev/null +++ b/src/BenchmarksApps/Rewrite/Data/EfDb.cs @@ -0,0 +1,43 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Options; +using Rewrite.Configuration; + +namespace Rewrite.Data +{ + + public class EfDb : IDb + { + private readonly ApplicationDbContext _dbContext; + + private readonly byte[] AdditionalFortune = "Additional fortune added at request time."u8.ToArray(); + public EfDb(ApplicationDbContext dbContext, IOptions appSettings) + { + + _dbContext = dbContext; + } + + public Task LoadSingleQueryRow() + { + throw new NotImplementedException(); + } + + private static readonly Func> _fortunesQuery + = EF.CompileAsyncQuery((ApplicationDbContext context) => context.Fortune); + + public async Task> LoadFortunesRows() + { + var result = new List(); + + await foreach (var fortune in _fortunesQuery(_dbContext)) + { + result.Add(fortune); + } + + result.Add(new Fortune { Message = AdditionalFortune }); + + result.Sort(); + + return result; + } + } +} diff --git a/src/BenchmarksApps/Rewrite/Data/Fortune.cs b/src/BenchmarksApps/Rewrite/Data/Fortune.cs new file mode 100644 index 000000000..90e7dde00 --- /dev/null +++ b/src/BenchmarksApps/Rewrite/Data/Fortune.cs @@ -0,0 +1,33 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Runtime.Serialization; + +namespace Rewrite.Data +{ + [Table("fortune")] + public class Fortune : IComparable, IComparable + { + [Column("id")] + public int Id { get; set; } + + [NotMapped] + [IgnoreDataMember] + public int _Id { get; set; } + + [Column("message")] + [MaxLength(2048)] + [IgnoreDataMember] + [Required] + public byte[] Message { get; set; } + + public int CompareTo(object obj) + { + return CompareTo((Fortune)obj); + } + + public int CompareTo(Fortune other) + { + return Message.AsSpan().SequenceCompareTo(other.Message.AsSpan()); + } + } +} diff --git a/src/BenchmarksApps/Rewrite/Data/IDb.cs b/src/BenchmarksApps/Rewrite/Data/IDb.cs new file mode 100644 index 000000000..69ceeafb9 --- /dev/null +++ b/src/BenchmarksApps/Rewrite/Data/IDb.cs @@ -0,0 +1,7 @@ +namespace Rewrite.Data +{ + public interface IDb + { + Task LoadSingleQueryRow(); + } +} diff --git a/src/BenchmarksApps/Rewrite/Program.cs b/src/BenchmarksApps/Rewrite/Program.cs index 6d3419f2b..091ad6b0b 100644 --- a/src/BenchmarksApps/Rewrite/Program.cs +++ b/src/BenchmarksApps/Rewrite/Program.cs @@ -1,16 +1,56 @@ -var builder = WebApplication.CreateBuilder(args); +using System.Data.Common; +using Microsoft.Data.SqlClient; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Storage; +using Npgsql; +using Rewrite.Configuration; +using Rewrite.Data; -foreach(string item in args) +WebApplicationBuilder builder = WebApplication.CreateBuilder(args); + +var hostingConfig = new ConfigurationBuilder() + .AddJsonFile("hosting.json", optional: true) + .AddEnvironmentVariables() + .AddCommandLine(args) + .Build(); + +string connectionString = hostingConfig["ConnectionString"] ?? "no Connectionstring found"; +string databaseServer = hostingConfig["database"] ?? "no DatabaseServer found"; + + + +builder.Services.AddEntityFrameworkNpgsql(); +var pgSettings = new NpgsqlConnectionStringBuilder(connectionString); + +builder.Services.AddDbContextPool( + options => options + .UseNpgsql(connectionString, + o => o.ExecutionStrategy(d => new NonRetryingExecutionStrategy(d))) + .EnableThreadSafetyChecks(false), + 1024); +; + + + +WebApplication app = builder.Build(); + +await using AsyncServiceScope scope = app.Services.CreateAsyncScope(); + +ApplicationDbContext dbContext = + scope.ServiceProvider.GetRequiredService(); + + +List fortunes = dbContext.Fortune.ToList(); + + +foreach(Fortune fortune in fortunes) { - Console.WriteLine(item); + Console.WriteLine($"Fortune: {fortune.Id} - {fortune.Message}"); } -// Add services to the container. - -var app = builder.Build(); // Configure the HTTP request pipeline. -var summaries = new[] +string[] summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; diff --git a/src/BenchmarksApps/Rewrite/Rewrite.csproj b/src/BenchmarksApps/Rewrite/Rewrite.csproj index 1b28a01c8..81a2bba23 100644 --- a/src/BenchmarksApps/Rewrite/Rewrite.csproj +++ b/src/BenchmarksApps/Rewrite/Rewrite.csproj @@ -1,9 +1,16 @@ - + - net8.0 + net9.0 enable enable + + + + + + + diff --git a/src/BenchmarksApps/Rewrite/appsettings.json b/src/BenchmarksApps/Rewrite/appsettings.json index 3b347d075..88b2787fa 100644 --- a/src/BenchmarksApps/Rewrite/appsettings.json +++ b/src/BenchmarksApps/Rewrite/appsettings.json @@ -1,4 +1,18 @@ { "ConnectionString": "", - "DatabaseServer": "Sqlite" + "DatabaseServer": "SqlServer", + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning", + "Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware": "Information" + }, + "Console": { + "FormatterOptions": { + "TimestampFormat": "HH:mm:ss " + + } + } + }, + "AllowedHosts": "*" } \ No newline at end of file From a27e721a23f10fd0f8d184e59e64808734c978ef Mon Sep 17 00:00:00 2001 From: cdincer Date: Thu, 10 Sep 2026 16:03:24 +0300 Subject: [PATCH 4/4] Adding rewrite rules through raw connection, Pruning for redundant classes --- .../postgres-techempower/create-postgres.sql | 46 +++++++++++++++ scenarios/rewrite.benchmarks.yml | 32 +--------- .../Rewrite/Data/ApplicationDbContext.cs | 17 ------ src/BenchmarksApps/Rewrite/Data/EfDb.cs | 43 -------------- src/BenchmarksApps/Rewrite/Data/Fortune.cs | 33 ----------- src/BenchmarksApps/Rewrite/Data/IDb.cs | 7 --- .../Rewrite/Data/RewriteRule.cs | 22 +++++++ src/BenchmarksApps/Rewrite/Program.cs | 59 +++++++++++-------- 8 files changed, 107 insertions(+), 152 deletions(-) delete mode 100644 src/BenchmarksApps/Rewrite/Data/ApplicationDbContext.cs delete mode 100644 src/BenchmarksApps/Rewrite/Data/EfDb.cs delete mode 100644 src/BenchmarksApps/Rewrite/Data/Fortune.cs delete mode 100644 src/BenchmarksApps/Rewrite/Data/IDb.cs create mode 100644 src/BenchmarksApps/Rewrite/Data/RewriteRule.cs diff --git a/docker/postgres-techempower/create-postgres.sql b/docker/postgres-techempower/create-postgres.sql index ab71ea75e..aedc047bf 100644 --- a/docker/postgres-techempower/create-postgres.sql +++ b/docker/postgres-techempower/create-postgres.sql @@ -60,4 +60,50 @@ INSERT INTO "Fortune" (id, message) VALUES (10, 'Computers make very fast, very INSERT INTO "Fortune" (id, message) VALUES (11, ''); INSERT INTO "Fortune" (id, message) VALUES (12, 'フレームワークのベンチマーク'); + +CREATE TABLE "RewriteRule" ( + id integer NOT NULL, + regex varchar(2048) NOT NULL, + replacement varchar(2048) NOT NULL, + PRIMARY KEY (id) +); + +GRANT SELECT ON "RewriteRule" to benchmarkdbuser; + +INSERT INTO "RewriteRule" (id, regex,replacement) VALUES (1, 'rewrite1' ,'replacement1'); +INSERT INTO "RewriteRule" (id, regex,replacement) VALUES (2, 'rewrite1' ,'replacement2'); +INSERT INTO "RewriteRule" (id, regex,replacement) VALUES (3, 'rewrite1' ,'replacement3'); +INSERT INTO "RewriteRule" (id, regex,replacement) VALUES (4, 'rewrite1' ,'replacement4'); +INSERT INTO "RewriteRule" (id, regex,replacement) VALUES (5, 'rewrite1' ,'replacement5'); +INSERT INTO "RewriteRule" (id, regex,replacement) VALUES (6, 'rewrite1' ,'replacement6'); +INSERT INTO "RewriteRule" (id, regex,replacement) VALUES (7, 'rewrite1' ,'replacement7'); +INSERT INTO "RewriteRule" (id, regex,replacement) VALUES (8, 'rewrite1' ,'replacement8'); +INSERT INTO "RewriteRule" (id, regex,replacement) VALUES (9, 'rewrite1' ,'replacement9'); +INSERT INTO "RewriteRule" (id, regex,replacement) VALUES (10,'rewrite1' ,'replacement10'); +INSERT INTO "RewriteRule" (id, regex,replacement) VALUES (11,'rewrite1' ,'replacement11'); +INSERT INTO "RewriteRule" (id, regex,replacement) VALUES (12,'rewrite1' ,'replacement12'); + + + +CREATE TABLE RewriteRule ( + id integer NOT NULL, + regex varchar(2048) NOT NULL, + replacement varchar(2048) NOT NULL, + PRIMARY KEY (id) +); +GRANT SELECT ON RewriteRule to benchmarkdbuser; + +INSERT INTO RewriteRule (id, regex,replacement) VALUES (1, 'rewrite1' ,'replacement1'); +INSERT INTO RewriteRule (id, regex,replacement) VALUES (2, 'rewrite1' ,'replacement2'); +INSERT INTO RewriteRule (id, regex,replacement) VALUES (3, 'rewrite1' ,'replacement3'); +INSERT INTO RewriteRule (id, regex,replacement) VALUES (4, 'rewrite1' ,'replacement4'); +INSERT INTO RewriteRule (id, regex,replacement) VALUES (5, 'rewrite1' ,'replacement5'); +INSERT INTO RewriteRule (id, regex,replacement) VALUES (6, 'rewrite1' ,'replacement6'); +INSERT INTO RewriteRule (id, regex,replacement) VALUES (7, 'rewrite1' ,'replacement7'); +INSERT INTO RewriteRule (id, regex,replacement) VALUES (8, 'rewrite1' ,'replacement8'); +INSERT INTO RewriteRule (id, regex,replacement) VALUES (9, 'rewrite1' ,'replacement9'); +INSERT INTO RewriteRule (id, regex,replacement) VALUES (10,'rewrite1' ,'replacement10'); +INSERT INTO RewriteRule (id, regex,replacement) VALUES (11,'rewrite1' ,'replacement11'); +INSERT INTO RewriteRule (id, regex,replacement) VALUES (12,'rewrite1' ,'replacement12'); + COMMIT; \ No newline at end of file diff --git a/scenarios/rewrite.benchmarks.yml b/scenarios/rewrite.benchmarks.yml index f7cf243b1..fb7862734 100644 --- a/scenarios/rewrite.benchmarks.yml +++ b/scenarios/rewrite.benchmarks.yml @@ -12,43 +12,19 @@ jobs: rewritebenchmarks: source: #repository: https://github.com/cdincer/Benchmarks.git - localFolder: ../ + localFolder: ../src/BenchmarksApps branchOrCommit: main - project: src/BenchmarksApps/Rewrite/Rewrite.csproj + project: Rewrite/Rewrite.csproj readyStateText: Application started. arguments: "--urls {{serverScheme}}://{{serverAddress}}:{{serverPort}} --scenario {{scenario}} --debug {{debug}}" environmentVariables: - database: PostgresQL connectionString: Server={{databaseServer}};Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=256;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4 - mssql: - source: - #repository: https://github.com/aspnet/benchmarks.git - branchOrCommit: main - localFolder: ../docker/mssql-techempower - dockerFile: Dockerfile - readyStateText: Data imported - noClean: true - - postgresql: - source: - #repository: https://github.com/TechEmpower/FrameworkBenchmarks.git - branchOrCommit: master - localFolder: ../docker/postgres-techempower - dockerFile: Dockerfile - readyStateText: ready to accept connections - noClean: true - - scenarios: rewrite1: - db: - job: postgresql application: job: rewritebenchmarks - variables: - scenario: rewrite load: job: wrk variables: @@ -57,9 +33,7 @@ scenarios: rewrite2: application: job: rewritebenchmarks - variables: - scenario: rewrite load: job: wrk variables: - path: /rewrite1 \ No newline at end of file + path: /rewrite2 \ No newline at end of file diff --git a/src/BenchmarksApps/Rewrite/Data/ApplicationDbContext.cs b/src/BenchmarksApps/Rewrite/Data/ApplicationDbContext.cs deleted file mode 100644 index f14616cbf..000000000 --- a/src/BenchmarksApps/Rewrite/Data/ApplicationDbContext.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.ChangeTracking; - -namespace Rewrite.Data -{ - public class ApplicationDbContext : DbContext - { - public ApplicationDbContext(DbContextOptions options) - : base(options) - { - ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; - ChangeTracker.AutoDetectChangesEnabled = false; - } - public DbSet Fortune { get; set; } - - } -} diff --git a/src/BenchmarksApps/Rewrite/Data/EfDb.cs b/src/BenchmarksApps/Rewrite/Data/EfDb.cs deleted file mode 100644 index 5063289d7..000000000 --- a/src/BenchmarksApps/Rewrite/Data/EfDb.cs +++ /dev/null @@ -1,43 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Options; -using Rewrite.Configuration; - -namespace Rewrite.Data -{ - - public class EfDb : IDb - { - private readonly ApplicationDbContext _dbContext; - - private readonly byte[] AdditionalFortune = "Additional fortune added at request time."u8.ToArray(); - public EfDb(ApplicationDbContext dbContext, IOptions appSettings) - { - - _dbContext = dbContext; - } - - public Task LoadSingleQueryRow() - { - throw new NotImplementedException(); - } - - private static readonly Func> _fortunesQuery - = EF.CompileAsyncQuery((ApplicationDbContext context) => context.Fortune); - - public async Task> LoadFortunesRows() - { - var result = new List(); - - await foreach (var fortune in _fortunesQuery(_dbContext)) - { - result.Add(fortune); - } - - result.Add(new Fortune { Message = AdditionalFortune }); - - result.Sort(); - - return result; - } - } -} diff --git a/src/BenchmarksApps/Rewrite/Data/Fortune.cs b/src/BenchmarksApps/Rewrite/Data/Fortune.cs deleted file mode 100644 index 90e7dde00..000000000 --- a/src/BenchmarksApps/Rewrite/Data/Fortune.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -using System.Runtime.Serialization; - -namespace Rewrite.Data -{ - [Table("fortune")] - public class Fortune : IComparable, IComparable - { - [Column("id")] - public int Id { get; set; } - - [NotMapped] - [IgnoreDataMember] - public int _Id { get; set; } - - [Column("message")] - [MaxLength(2048)] - [IgnoreDataMember] - [Required] - public byte[] Message { get; set; } - - public int CompareTo(object obj) - { - return CompareTo((Fortune)obj); - } - - public int CompareTo(Fortune other) - { - return Message.AsSpan().SequenceCompareTo(other.Message.AsSpan()); - } - } -} diff --git a/src/BenchmarksApps/Rewrite/Data/IDb.cs b/src/BenchmarksApps/Rewrite/Data/IDb.cs deleted file mode 100644 index 69ceeafb9..000000000 --- a/src/BenchmarksApps/Rewrite/Data/IDb.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Rewrite.Data -{ - public interface IDb - { - Task LoadSingleQueryRow(); - } -} diff --git a/src/BenchmarksApps/Rewrite/Data/RewriteRule.cs b/src/BenchmarksApps/Rewrite/Data/RewriteRule.cs new file mode 100644 index 000000000..86092fcbc --- /dev/null +++ b/src/BenchmarksApps/Rewrite/Data/RewriteRule.cs @@ -0,0 +1,22 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Runtime.Serialization; + +namespace Rewrite.Data +{ + [Table("RewriteRule")] + public class RewriteRule + { + [Column("id")] + public int Id { get; set; } + + + [Column("regex")] + [MaxLength(2048)] + public string? Regex { get; set; } + + [Column("replacement")] + [MaxLength(2048)] + public string? Replacement { get; set; } + } +} diff --git a/src/BenchmarksApps/Rewrite/Program.cs b/src/BenchmarksApps/Rewrite/Program.cs index 091ad6b0b..4c13bcf5c 100644 --- a/src/BenchmarksApps/Rewrite/Program.cs +++ b/src/BenchmarksApps/Rewrite/Program.cs @@ -1,4 +1,5 @@ using System.Data.Common; +using Microsoft.AspNetCore.Rewrite; using Microsoft.Data.SqlClient; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Storage; @@ -15,40 +16,38 @@ .Build(); string connectionString = hostingConfig["ConnectionString"] ?? "no Connectionstring found"; -string databaseServer = hostingConfig["database"] ?? "no DatabaseServer found"; +await using var dataSource = NpgsqlDataSource.Create(connectionString); -builder.Services.AddEntityFrameworkNpgsql(); -var pgSettings = new NpgsqlConnectionStringBuilder(connectionString); +await using var command = dataSource.CreateCommand("SELECT id,regex,replacement FROM \"RewriteRule\""); +await using var reader = await command.ExecuteReaderAsync(); -builder.Services.AddDbContextPool( - options => options - .UseNpgsql(connectionString, - o => o.ExecutionStrategy(d => new NonRetryingExecutionStrategy(d))) - .EnableThreadSafetyChecks(false), - 1024); -; +List rewriteRules = new(); +while (await reader.ReadAsync()) +{ + RewriteRule rule = new RewriteRule + { + Id = reader.GetFieldValue(0), + Regex = reader.GetFieldValue(1), + Replacement = reader.GetFieldValue(2) + }; + rewriteRules.Add(rule); +}; +var options = new RewriteOptions(); - -WebApplication app = builder.Build(); - -await using AsyncServiceScope scope = app.Services.CreateAsyncScope(); - -ApplicationDbContext dbContext = - scope.ServiceProvider.GetRequiredService(); +foreach(RewriteRule rewriteRule in rewriteRules) +{ + options.AddRewrite(rewriteRule.Regex, rewriteRule.Replacement,skipRemainingRules: false); +} -List fortunes = dbContext.Fortune.ToList(); +WebApplication app = builder.Build(); +app.UseRewriter(options); -foreach(Fortune fortune in fortunes) -{ - Console.WriteLine($"Fortune: {fortune.Id} - {fortune.Message}"); -} -// Configure the HTTP request pipeline. string[] summaries = new[] { @@ -68,6 +67,20 @@ return forecast; }); + +app.MapGet("/rewrite2", () => +{ + var forecast = Enumerable.Range(1, 5).Select(index => + new WeatherForecast + ( + DateOnly.FromDateTime(DateTime.Now.AddDays(index)), + Random.Shared.Next(-20, 55), + summaries[Random.Shared.Next(summaries.Length)] + )) + .ToArray(); + return forecast; +}); + app.Run(); internal record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary)