Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ global.json
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

# Crank results
.crank/

# Build results
[Dd]ebug/
[Dd]ebugPublic/
Expand Down
141 changes: 141 additions & 0 deletions src/BenchmarksApps.sln
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.6.33416.333
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BasicMinimalApi", "BenchmarksApps\BasicMinimalApi\BasicMinimalApi.csproj", "{D13E5EF8-8DA6-4904-891D-1A8D8AAC04DD}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HelloWorldMiddleware", "BenchmarksApps\HelloWorldMiddleware\HelloWorldMiddleware.csproj", "{48EDA7B2-BFBF-4634-BA8B-81608F78D93C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HelloWorldMvc", "BenchmarksApps\HelloWorldMvc\HelloWorldMvc.csproj", "{23CDC3E1-C073-4D8C-92D6-425E181CD5E3}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MapAction", "BenchmarksApps\MapAction\MapAction.csproj", "{58029BDE-4A26-4819-8776-A1B1B6075C51}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mvc", "BenchmarksApps\Mvc\Mvc.csproj", "{34448A4F-80AC-4795-B644-BED3227A0086}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StaticFiles", "BenchmarksApps\StaticFiles\StaticFiles.csproj", "{EB296FAF-53D2-4E93-B6E5-C679FD3AE73D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DistributedCache", "BenchmarksApps\DistributedCache\DistributedCache.csproj", "{AB0D447E-476F-4482-A844-BC2654C308F5}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Grpc", "Grpc", "{D8A014FB-3C99-4831-9FFB-F4A89A48D8BD}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BasicGrpc", "BenchmarksApps\Grpc\BasicGrpc\BasicGrpc.csproj", "{8DF3A6BB-E8C5-4FAA-839A-D185C9F93CD5}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GrpcHttpApiServer", "GrpcHttpApiServer", "{9E4AF835-2A78-4012-B0B5-9DA41ACDC716}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Server", "BenchmarksApps\Grpc\GrpcHttpApiServer\Server\Server.csproj", "{20757830-EA66-4962-BDBB-A101A2062A2C}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TechEmpower", "TechEmpower", "{B6DB234C-8F80-4160-B95D-D70AFC444A3D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Minimal", "BenchmarksApps\TechEmpower\Minimal\Minimal.csproj", "{07C0B18B-9738-4349-A8DF-3E88D3DF90AE}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mvc", "BenchmarksApps\TechEmpower\Mvc\Mvc.csproj", "{E68B58F8-40EA-49EA-A126-0B67F2BE7343}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PlatformBenchmarks", "BenchmarksApps\TechEmpower\PlatformBenchmarks\PlatformBenchmarks.csproj", "{ACA43671-AD28-4F72-AAAB-6C32B388C2F0}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{689C58F6-8DF0-4565-887F-C9A9BDA757D8}"
ProjectSection(SolutionItems) = preProject
Directory.Build.props = Directory.Build.props
Directory.Build.targets = Directory.Build.targets
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BuildPerformance", "BenchmarksApps\BuildPerformance\BuildPerformance.csproj", "{2E953AFB-4900-4B5D-9E78-819E950CD365}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SignalR", "SignalR", "{398A40DA-FE1D-4B4D-A580-A33E29885553}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BenchmarkServer", "BenchmarksApps\SignalR\BenchmarkServer.csproj", "{D8F11F87-823F-4864-926D-5F66448A5C13}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Websocket", "Websocket", "{6A69DE6C-07A6-4ABE-A4D2-0F983A33BBF8}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BenchmarkServer", "BenchmarksApps\Websocket\BenchmarkServer.csproj", "{3D2573DE-CE7A-4CB8-A980-8C8636EE059E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TcpEcho", "BenchmarksApps\TcpEcho\TcpEcho.csproj", "{436118C1-B9A7-4966-86AB-6F2477B6B201}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D13E5EF8-8DA6-4904-891D-1A8D8AAC04DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D13E5EF8-8DA6-4904-891D-1A8D8AAC04DD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D13E5EF8-8DA6-4904-891D-1A8D8AAC04DD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D13E5EF8-8DA6-4904-891D-1A8D8AAC04DD}.Release|Any CPU.Build.0 = Release|Any CPU
{48EDA7B2-BFBF-4634-BA8B-81608F78D93C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{48EDA7B2-BFBF-4634-BA8B-81608F78D93C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{48EDA7B2-BFBF-4634-BA8B-81608F78D93C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{48EDA7B2-BFBF-4634-BA8B-81608F78D93C}.Release|Any CPU.Build.0 = Release|Any CPU
{23CDC3E1-C073-4D8C-92D6-425E181CD5E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{23CDC3E1-C073-4D8C-92D6-425E181CD5E3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{23CDC3E1-C073-4D8C-92D6-425E181CD5E3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{23CDC3E1-C073-4D8C-92D6-425E181CD5E3}.Release|Any CPU.Build.0 = Release|Any CPU
{58029BDE-4A26-4819-8776-A1B1B6075C51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{58029BDE-4A26-4819-8776-A1B1B6075C51}.Debug|Any CPU.Build.0 = Debug|Any CPU
{58029BDE-4A26-4819-8776-A1B1B6075C51}.Release|Any CPU.ActiveCfg = Release|Any CPU
{58029BDE-4A26-4819-8776-A1B1B6075C51}.Release|Any CPU.Build.0 = Release|Any CPU
{34448A4F-80AC-4795-B644-BED3227A0086}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{34448A4F-80AC-4795-B644-BED3227A0086}.Debug|Any CPU.Build.0 = Debug|Any CPU
{34448A4F-80AC-4795-B644-BED3227A0086}.Release|Any CPU.ActiveCfg = Release|Any CPU
{34448A4F-80AC-4795-B644-BED3227A0086}.Release|Any CPU.Build.0 = Release|Any CPU
{EB296FAF-53D2-4E93-B6E5-C679FD3AE73D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EB296FAF-53D2-4E93-B6E5-C679FD3AE73D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EB296FAF-53D2-4E93-B6E5-C679FD3AE73D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EB296FAF-53D2-4E93-B6E5-C679FD3AE73D}.Release|Any CPU.Build.0 = Release|Any CPU
{AB0D447E-476F-4482-A844-BC2654C308F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AB0D447E-476F-4482-A844-BC2654C308F5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AB0D447E-476F-4482-A844-BC2654C308F5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AB0D447E-476F-4482-A844-BC2654C308F5}.Release|Any CPU.Build.0 = Release|Any CPU
{8DF3A6BB-E8C5-4FAA-839A-D185C9F93CD5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8DF3A6BB-E8C5-4FAA-839A-D185C9F93CD5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8DF3A6BB-E8C5-4FAA-839A-D185C9F93CD5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8DF3A6BB-E8C5-4FAA-839A-D185C9F93CD5}.Release|Any CPU.Build.0 = Release|Any CPU
{20757830-EA66-4962-BDBB-A101A2062A2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{20757830-EA66-4962-BDBB-A101A2062A2C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{20757830-EA66-4962-BDBB-A101A2062A2C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{20757830-EA66-4962-BDBB-A101A2062A2C}.Release|Any CPU.Build.0 = Release|Any CPU
{07C0B18B-9738-4349-A8DF-3E88D3DF90AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{07C0B18B-9738-4349-A8DF-3E88D3DF90AE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{07C0B18B-9738-4349-A8DF-3E88D3DF90AE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{07C0B18B-9738-4349-A8DF-3E88D3DF90AE}.Release|Any CPU.Build.0 = Release|Any CPU
{E68B58F8-40EA-49EA-A126-0B67F2BE7343}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E68B58F8-40EA-49EA-A126-0B67F2BE7343}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E68B58F8-40EA-49EA-A126-0B67F2BE7343}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E68B58F8-40EA-49EA-A126-0B67F2BE7343}.Release|Any CPU.Build.0 = Release|Any CPU
{ACA43671-AD28-4F72-AAAB-6C32B388C2F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{ACA43671-AD28-4F72-AAAB-6C32B388C2F0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{ACA43671-AD28-4F72-AAAB-6C32B388C2F0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{ACA43671-AD28-4F72-AAAB-6C32B388C2F0}.Release|Any CPU.Build.0 = Release|Any CPU
{2E953AFB-4900-4B5D-9E78-819E950CD365}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2E953AFB-4900-4B5D-9E78-819E950CD365}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2E953AFB-4900-4B5D-9E78-819E950CD365}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2E953AFB-4900-4B5D-9E78-819E950CD365}.Release|Any CPU.Build.0 = Release|Any CPU
{D8F11F87-823F-4864-926D-5F66448A5C13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D8F11F87-823F-4864-926D-5F66448A5C13}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D8F11F87-823F-4864-926D-5F66448A5C13}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D8F11F87-823F-4864-926D-5F66448A5C13}.Release|Any CPU.Build.0 = Release|Any CPU
{3D2573DE-CE7A-4CB8-A980-8C8636EE059E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3D2573DE-CE7A-4CB8-A980-8C8636EE059E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3D2573DE-CE7A-4CB8-A980-8C8636EE059E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3D2573DE-CE7A-4CB8-A980-8C8636EE059E}.Release|Any CPU.Build.0 = Release|Any CPU
{436118C1-B9A7-4966-86AB-6F2477B6B201}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{436118C1-B9A7-4966-86AB-6F2477B6B201}.Debug|Any CPU.Build.0 = Debug|Any CPU
{436118C1-B9A7-4966-86AB-6F2477B6B201}.Release|Any CPU.ActiveCfg = Release|Any CPU
{436118C1-B9A7-4966-86AB-6F2477B6B201}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{8DF3A6BB-E8C5-4FAA-839A-D185C9F93CD5} = {D8A014FB-3C99-4831-9FFB-F4A89A48D8BD}
{9E4AF835-2A78-4012-B0B5-9DA41ACDC716} = {D8A014FB-3C99-4831-9FFB-F4A89A48D8BD}
{20757830-EA66-4962-BDBB-A101A2062A2C} = {9E4AF835-2A78-4012-B0B5-9DA41ACDC716}
{07C0B18B-9738-4349-A8DF-3E88D3DF90AE} = {B6DB234C-8F80-4160-B95D-D70AFC444A3D}
{E68B58F8-40EA-49EA-A126-0B67F2BE7343} = {B6DB234C-8F80-4160-B95D-D70AFC444A3D}
{ACA43671-AD28-4F72-AAAB-6C32B388C2F0} = {B6DB234C-8F80-4160-B95D-D70AFC444A3D}
{D8F11F87-823F-4864-926D-5F66448A5C13} = {398A40DA-FE1D-4B4D-A580-A33E29885553}
{3D2573DE-CE7A-4CB8-A980-8C8636EE059E} = {6A69DE6C-07A6-4ABE-A4D2-0F983A33BBF8}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {117072DC-DE12-4F74-90CA-692FA2BE8DCB}
EndGlobalSection
EndGlobal
163 changes: 73 additions & 90 deletions src/BenchmarksApps/TechEmpower/Minimal/Database/Db.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,118 +2,101 @@
using Dapper;
using Minimal.Models;

namespace Minimal.Database
namespace Minimal.Database;

public class Db
{
public class Db
private static readonly Comparison<Fortune> FortuneSortComparison = (a, b) => string.CompareOrdinal(a.Message, b.Message);

private readonly DbProviderFactory _dbProviderFactory;
private readonly string _connectionString;

public Db(AppSettings appSettings)
{
private static readonly Comparison<Fortune> FortuneSortComparison = (a, b) => string.CompareOrdinal(a.Message, b.Message);
ArgumentException.ThrowIfNullOrEmpty(appSettings.ConnectionString);

private static readonly Random _random = Random.Shared;
_dbProviderFactory = Npgsql.NpgsqlFactory.Instance;
_connectionString = appSettings.ConnectionString;
}

private readonly DbProviderFactory _dbProviderFactory;
private readonly string _connectionString;
public Task<World> LoadSingleQueryRow()
{
using var db = _dbProviderFactory.CreateConnection();
db!.ConnectionString = _connectionString;

public Db(AppSettings appSettings)
{
ArgumentNullException.ThrowIfNull(appSettings.ConnectionString);
// Note: Don't need to open connection if only doing one thing; let dapper do it
return ReadSingleRow(db);
}

_dbProviderFactory = Npgsql.NpgsqlFactory.Instance;
_connectionString = appSettings.ConnectionString;
}
static Task<World> ReadSingleRow(DbConnection db)
{
return db.QueryFirstOrDefaultAsync<World>(
"SELECT id, randomnumber FROM world WHERE id = @Id",
new { Id = Random.Shared.Next(1, 10001) });
}

public Task<World> LoadSingleQueryRow()
{
using var db = _dbProviderFactory.CreateConnection();
db!.ConnectionString = _connectionString;
public async Task<World[]> LoadMultipleQueriesRows(int count)
{
count = Math.Clamp(count, 1, 500);

// Note: Don't need to open connection if only doing one thing; let dapper do it
return ReadSingleRow(db);
}
var results = new World[count];
using var db = _dbProviderFactory.CreateConnection();

db!.ConnectionString = _connectionString;
await db.OpenAsync();

static Task<World> ReadSingleRow(DbConnection db)
for (var i = 0; i < count; i++)
{
return db.QueryFirstOrDefaultAsync<World>(
"SELECT id, randomnumber FROM world WHERE id = @Id",
new { Id = _random.Next(1, 10001) });
results[i] = await ReadSingleRow(db);
}

public async Task<World[]> LoadMultipleQueriesRows(int count)
return results;
}

public async Task<World[]> LoadMultipleUpdatesRows(int count)
{
count = Math.Clamp(count, 1, 500);

var parameters = new Dictionary<string, object>();

using var db = _dbProviderFactory.CreateConnection();

db!.ConnectionString = _connectionString;
await db.OpenAsync();

var results = new World[count];
for (var i = 0; i < count; i++)
{
if (count <= 0)
{
count = 1;
}
else if (count > 500)
{
count = 500;
}

var results = new World[count];
using var db = _dbProviderFactory.CreateConnection();

db!.ConnectionString = _connectionString;
await db.OpenAsync();

for (var i = 0; i < count; i++)
{
results[i] = await ReadSingleRow(db);
}

return results;
results[i] = await ReadSingleRow(db);
}

public async Task<World[]> LoadMultipleUpdatesRows(int count)
for (var i = 0; i < count; i++)
{
if (count <= 0)
{
count = 1;
}
else if (count > 500)
{
count = 500;
}

var parameters = new Dictionary<string, object>();

using var db = _dbProviderFactory.CreateConnection();

db!.ConnectionString = _connectionString;
await db.OpenAsync();

var results = new World[count];
for (var i = 0; i < count; i++)
{
results[i] = await ReadSingleRow(db);
}

for (var i = 0; i < count; i++)
{
var randomNumber = _random.Next(1, 10001);
parameters[$"@Rn_{i}"] = randomNumber;
parameters[$"@Id_{i}"] = results[i].Id;

results[i].RandomNumber = randomNumber;
}

await db.ExecuteAsync(BatchUpdateString.Query(count), parameters);
return results;
var randomNumber = Random.Shared.Next(1, 10001);
parameters[$"@Rn_{i}"] = randomNumber;
parameters[$"@Id_{i}"] = results[i].Id;

results[i].RandomNumber = randomNumber;
}

public async Task<List<Fortune>> LoadFortunesRows()
{
List<Fortune> result;
await db.ExecuteAsync(BatchUpdateString.Query(count), parameters);
return results;
}

using var db = _dbProviderFactory.CreateConnection();
public async Task<List<Fortune>> LoadFortunesRows()
{
List<Fortune> result;

db!.ConnectionString = _connectionString;
using var db = _dbProviderFactory.CreateConnection();

// Note: don't need to open connection if only doing one thing; let dapper do it
result = (await db.QueryAsync<Fortune>("SELECT id, message FROM fortune")).AsList();
db!.ConnectionString = _connectionString;

result.Add(new Fortune(0, "Additional fortune added at request time."));
result.Sort(FortuneSortComparison);
// Note: don't need to open connection if only doing one thing; let dapper do it
result = (await db.QueryAsync<Fortune>("SELECT id, message FROM fortune")).AsList();

return result;
}
result.Add(new Fortune(0, "Additional fortune added at request time."));
result.Sort(FortuneSortComparison);

return result;
}
}
4 changes: 3 additions & 1 deletion src/BenchmarksApps/TechEmpower/Minimal/Minimal.csproj
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<LangVersion>latest</LangVersion>
<UserSecretsId>38063504-d08c-495a-89c9-daaad2f60f31</UserSecretsId>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Npgsql" Version="8.0.0-preview.1" />
<PackageReference Include="Dapper" Version="2.0.123" />
<PackageReference Include="RazorSlices" Version="0.3.0" />
</ItemGroup>

</Project>
Loading