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/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 new file mode 100644 index 000000000..fb7862734 --- /dev/null +++ b/scenarios/rewrite.benchmarks.yml @@ -0,0 +1,39 @@ +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: + rewritebenchmarks: + source: + #repository: https://github.com/cdincer/Benchmarks.git + localFolder: ../src/BenchmarksApps + branchOrCommit: main + project: Rewrite/Rewrite.csproj + readyStateText: Application started. + arguments: "--urls {{serverScheme}}://{{serverAddress}}:{{serverPort}} --scenario {{scenario}} --debug {{debug}}" + environmentVariables: + connectionString: Server={{databaseServer}};Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=256;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4 + +scenarios: + + rewrite1: + application: + job: rewritebenchmarks + load: + job: wrk + variables: + path: /rewrite1 + + rewrite2: + application: + job: rewritebenchmarks + load: + job: wrk + variables: + path: /rewrite2 \ 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/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/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 new file mode 100644 index 000000000..4c13bcf5c --- /dev/null +++ b/src/BenchmarksApps/Rewrite/Program.cs @@ -0,0 +1,89 @@ +using System.Data.Common; +using Microsoft.AspNetCore.Rewrite; +using Microsoft.Data.SqlClient; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Storage; +using Npgsql; +using Rewrite.Configuration; +using Rewrite.Data; + +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"; + + +await using var dataSource = NpgsqlDataSource.Create(connectionString); + +await using var command = dataSource.CreateCommand("SELECT id,regex,replacement FROM \"RewriteRule\""); +await using var reader = await command.ExecuteReaderAsync(); + +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(); + +foreach(RewriteRule rewriteRule in rewriteRules) +{ + options.AddRewrite(rewriteRule.Regex, rewriteRule.Replacement,skipRemainingRules: false); +} + + +WebApplication app = builder.Build(); + +app.UseRewriter(options); + + + +string[] 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.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) +{ + 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..81a2bba23 --- /dev/null +++ b/src/BenchmarksApps/Rewrite/Rewrite.csproj @@ -0,0 +1,16 @@ + + + + net9.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..88b2787fa --- /dev/null +++ b/src/BenchmarksApps/Rewrite/appsettings.json @@ -0,0 +1,18 @@ +{ + "ConnectionString": "", + "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