Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor benchmarks #1203

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@ bin
obj
out/
.idea
/BenchmarkDotNet.Artifacts
15 changes: 15 additions & 0 deletions run-benchmark.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
param(
[ValidateSet('CommandBenchmark')]
$Benchmark = 'CommandBenchmark'
)

$ErrorActionPreference = 'Stop'

$projectFile = '.\src\FirebirdSql.Data.FirebirdClient.Benchmarks\FirebirdSql.Data.FirebirdClient.Benchmarks.csproj'

# Run selected benchmark
dotnet run `
--project $projectFile `
--configuration 'Release' `
-- `
--filter "*$($Benchmark)*"
Original file line number Diff line number Diff line change
Expand Up @@ -16,44 +16,40 @@
//$Authors = Jiri Cincura ([email protected])

using BenchmarkDotNet.Attributes;
using FirebirdSql.Data.FirebirdClient;

namespace Perf;
namespace FirebirdSql.Data.FirebirdClient.Benchmarks;

partial class CommandBenchmark
public partial class CommandBenchmark
{
[GlobalSetup(Target = nameof(Execute))]
public void ExecuteGlobalSetup()
{
GlobalSetupBase();
using (var conn = new FbConnection(ConnectionString))
{
conn.Open();
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = $"create table foobar (x {DataType})";
cmd.ExecuteNonQuery();
}
}
CreateDatabase();

using var conn = new FbConnection(ConnectionString);
conn.Open();

using var cmd = conn.CreateCommand();
cmd.CommandText = $"CREATE TABLE foobar (x {DataType})";
cmd.ExecuteNonQuery();
}

[Benchmark]
public void Execute()
{
using (var conn = new FbConnection(ConnectionString))
using var conn = new FbConnection(ConnectionString);
conn.Open();

using var cmd = conn.CreateCommand();
cmd.CommandText = @"INSERT INTO foobar (x) VALUES (@cnt)";

var p = new FbParameter() { ParameterName = "@cnt" };
cmd.Parameters.Add(p);

for (var i = 0; i < Count; i++)
{
conn.Open();
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = @"insert into foobar values (@cnt)";
var p = new FbParameter() { ParameterName = "@cnt" };
cmd.Parameters.Add(p);
for (var i = 0; i < Count; i++)
{
p.Value = i;
cmd.ExecuteNonQuery();
}
}
p.Value = i;
cmd.ExecuteNonQuery();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/*
* The contents of this file are subject to the Initial
* Developer's Public License Version 1.0 (the "License");
* you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
* https://github.com/FirebirdSQL/NETProvider/raw/master/license.txt.
*
* Software distributed under the License is distributed on
* an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for the specific
* language governing rights and limitations under the License.
*
* All Rights Reserved.
*/

//$Authors = Jiri Cincura ([email protected])

using BenchmarkDotNet.Attributes;

namespace FirebirdSql.Data.FirebirdClient.Benchmarks;

public partial class CommandBenchmark
{
[GlobalSetup(Target = nameof(Fetch))]
public void FetchGlobalSetup()
{
CreateDatabase();

using var conn = new FbConnection(ConnectionString);
conn.Open();

using (var cmd = conn.CreateCommand())
{
cmd.CommandText = $"CREATE TABLE foobar (x {DataType})";
cmd.ExecuteNonQuery();
}

using (var cmd = conn.CreateCommand())
{
cmd.CommandText = $"""
EXECUTE BLOCK AS
DECLARE cnt INT;
BEGIN
cnt = {Count};
WHILE (cnt > 0) DO
BEGIN
INSERT INTO foobar VALUES (:cnt);
cnt = cnt - 1;
END
END
""";
cmd.ExecuteNonQuery();
}
}

[Benchmark]
public void Fetch()
{
using var conn = new FbConnection(ConnectionString);
conn.Open();

using var cmd = conn.CreateCommand();
cmd.CommandText = "SELECT x FROM foobar";

using var reader = cmd.ExecuteReader();
while (reader.Read())
{
var _ = reader[0];
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@
using BenchmarkDotNet.Environments;
using BenchmarkDotNet.Jobs;
using BenchmarkDotNet.Toolchains.CsProj;
using FirebirdSql.Data.FirebirdClient;
using BenchmarkDotNet.Validators;

namespace Perf;
namespace FirebirdSql.Data.FirebirdClient.Benchmarks;

[Config(typeof(Config))]
public partial class CommandBenchmark
Expand All @@ -34,30 +34,46 @@ public Config()
{
var baseJob = Job.Default
.WithWarmupCount(3)
.WithToolchain(CsProjCoreToolchain.NetCoreApp60)
.WithPlatform(Platform.X64)
.WithJit(Jit.RyuJit);

AddJob(
baseJob
.WithToolchain(CsProjCoreToolchain.NetCoreApp80)
.WithCustomBuildConfiguration("ReleaseNuGet")
.WithId("NuGet80")
.AsBaseline()
);

AddJob(
baseJob
.WithToolchain(CsProjCoreToolchain.NetCoreApp80)
.WithCustomBuildConfiguration("Release")
.WithId("Core80")
);

AddDiagnoser(MemoryDiagnoser.Default);
AddJob(baseJob.WithCustomBuildConfiguration("Release").WithId("Project"));
AddJob(baseJob.WithCustomBuildConfiguration("ReleaseNuGet").WithId("NuGet").AsBaseline());

AddValidator(BaselineValidator.FailOnError);
AddValidator(JitOptimizationsValidator.FailOnError);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If full JSON (*full.json) reports are exported then benchmarks results can be compared historically using ResultsComparer.

AddExporter(JsonExporter.Full);

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Never mind, I see how it is supposed to work now!

}
}

protected const string ConnectionString = "database=localhost:benchmark.fdb;user=sysdba;password=masterkey";

[Params("bigint", "varchar(10) character set utf8")]
[Params("BIGINT", "VARCHAR(10) CHARACTER SET UTF8")]
public string DataType { get; set; }

[Params(100)]
public int Count { get; set; }

void GlobalSetupBase()
static void CreateDatabase()
{
FbConnection.CreateDatabase(ConnectionString, 16 * 1024, false, true);
}

[GlobalCleanup]
public void GlobalCleanup()
public static void GlobalCleanup()
{
FbConnection.ClearAllPools();
FbConnection.DropDatabase(ConnectionString);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<SkipSourceLink>true</SkipSourceLink>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.13.2" />
<PackageReference Include="BenchmarkDotNet" Version="0.14.0" />
</ItemGroup>

<ItemGroup>
Expand All @@ -19,6 +19,6 @@
</ItemGroup>

<ItemGroup Condition="$(Configuration.EndsWith('NuGet'))">
<PackageReference Include="FirebirdSql.Data.FirebirdClient" Version="8.5.4" />
<PackageReference Include="FirebirdSql.Data.FirebirdClient" Version="10.3.1" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,8 @@

//$Authors = Jiri Cincura ([email protected])

using System.Reflection;
using BenchmarkDotNet.Running;

namespace Perf;

class Program
{
static void Main(string[] args)
{
BenchmarkRunner.Run(Assembly.GetExecutingAssembly());
}
}
BenchmarkSwitcher
.FromAssembly(typeof(Program).Assembly)
.Run(args);
18 changes: 18 additions & 0 deletions src/FirebirdSql.Data.FirebirdClient.Tests/FbTransactionTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -139,4 +139,22 @@ public async Task SnapshotAtNumber()
}
}
}

[Test]
public async Task CanGetTransactionId()
{
if (!EnsureServerVersionAtLeast(new Version(2, 5, 0, 0)))
return;

await using (var transaction1 = await Connection.BeginTransactionAsync())
{
var idFromInfo = await new FbTransactionInfo(transaction1).GetTransactionIdAsync();
Assert.NotZero(idFromInfo);

var command = new FbCommand("SELECT current_transaction FROM rdb$database", Connection, transaction1);
var idFromSql = await command.ExecuteScalarAsync();

Assert.AreEqual(idFromInfo, idFromSql);
}
}
}
4 changes: 4 additions & 0 deletions src/FirebirdSql.Data.FirebirdClient/Common/IscHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,10 @@ public static List<object> ParseTransactionInfo(byte[] buffer, Charset charset)
case IscCodes.isc_info_error:
throw FbException.Create("Received error response.");

case IscCodes.isc_info_tra_id:
info.Add(VaxInteger(buffer, pos, length));
break;

case IscCodes.fb_info_tra_snapshot_number:
info.Add(VaxInteger(buffer, pos, length));
break;
Expand Down
Loading