Skip to content
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
33 changes: 23 additions & 10 deletions test/AsmResolver.Benchmarks/AsmResolver.Benchmarks.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,31 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.14.0" />
<PackageReference Include="System.CommandLine" Version="2.0.0-beta4.22272.1" />
<PackageReference Include="BenchmarkDotNet" Version="0.15.8" />
<PackageReference Include="BenchmarkDotNet.Diagnostics.Windows" Version="0.15.8" />
<PackageReference Include="System.CommandLine" Version="2.0.0-beta4.22272.1" />

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

2.0.10 is currently the latest stable version.

@nike4613 nike4613 Jul 26, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

2.0.10 is also a different library with a different (and imo worse) API.

</ItemGroup>

<ItemGroup Condition="'$(UsePackage)' != 'false'">
<ProjectReference Include="..\..\src\AsmResolver.DotNet\AsmResolver.DotNet.csproj" />
<ProjectReference Include="..\..\src\AsmResolver.PE.File\AsmResolver.PE.File.csproj" />
<ProjectReference Include="..\..\src\AsmResolver.PE.Win32Resources\AsmResolver.PE.Win32Resources.csproj" />
<ProjectReference Include="..\..\src\AsmResolver.PE\AsmResolver.PE.csproj" />
<ProjectReference Include="..\..\src\AsmResolver\AsmResolver.csproj" />
</ItemGroup>

<ItemGroup Condition="'$(UsePackage)' == 'true'">
<PackageReference Include="AsmResolver" Version="$(PackagesBaselineVersion)" />
<PackageReference Include="AsmResolver.PE.File" Version="$(PackagesBaselineVersion)" />
<PackageReference Include="AsmResolver.PE" Version="$(PackagesBaselineVersion)" />
<PackageReference Include="AsmResolver.PE.Win32Resources" Version="$(PackagesBaselineVersion)" />
<PackageReference Include="AsmResolver.DotNet" Version="$(PackagesBaselineVersion)" />
<PackageReference Include="AsmResolver.DotNet.Dynamic" Version="$(PackagesBaselineVersion)" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\src\AsmResolver.DotNet\AsmResolver.DotNet.csproj" />
<ProjectReference Include="..\..\src\AsmResolver.PE.File\AsmResolver.PE.File.csproj" />
<ProjectReference Include="..\..\src\AsmResolver.PE.Win32Resources\AsmResolver.PE.Win32Resources.csproj" />
<ProjectReference Include="..\..\src\AsmResolver.PE\AsmResolver.PE.csproj" />
<ProjectReference Include="..\..\src\AsmResolver\AsmResolver.csproj" />
<ProjectReference Include="..\TestBinaries\DotNet\AsmResolver.DotNet.TestCases.Methods\AsmResolver.DotNet.TestCases.Methods.csproj" />
<ProjectReference Include="..\TestBinaries\DotNet\AsmResolver.DotNet.TestCases.Types\AsmResolver.DotNet.TestCases.Types.csproj" />
<ProjectReference Include="..\TestBinaries\DotNet\AsmResolver.DotNet.TestCases.Methods\AsmResolver.DotNet.TestCases.Methods.csproj" />
<ProjectReference Include="..\TestBinaries\DotNet\AsmResolver.DotNet.TestCases.Types\AsmResolver.DotNet.TestCases.Types.csproj" />
</ItemGroup>

<ItemGroup>
Expand All @@ -34,4 +47,4 @@
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
</ItemGroup>
</Project>
</Project>
76 changes: 55 additions & 21 deletions test/AsmResolver.Benchmarks/Program.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
using System;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Configs;
using BenchmarkDotNet.Diagnosers;
using BenchmarkDotNet.Jobs;
using BenchmarkDotNet.Running;
using System;
using System.CommandLine;
using System.CommandLine.Builder;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using BenchmarkDotNet.Configs;
using BenchmarkDotNet.Jobs;
using BenchmarkDotNet.Running;

namespace AsmResolver.Benchmarks
{
Expand All @@ -21,46 +22,79 @@ public static async Task<int> Main(string[] args)

var baselineVersionOption = new Option<string?>("--baseline",
"Compare the results to a different nuget version of AsmResolver.");
var onlyOption = new Option<string?>("--type",
var useProfilerOption = new Option<bool>("--profiler",
"Enable a profiler.");
var hardwareCountersOption = new Option<bool>("--counters",
"Include hardware counters in the benchmark (automatically enables the --profiler option).");
var onlyTypeOption = new Option<string?>("--type",
"Only run the benchmarks in the specified benchmark type.");

runCommand.AddOption(baselineVersionOption);
runCommand.AddOption(onlyOption);
runCommand.AddOption(useProfilerOption);
runCommand.AddOption(hardwareCountersOption);
runCommand.AddOption(onlyTypeOption);

runCommand.SetHandler((baselineVersion, benchmarkType) =>
runCommand.SetHandler((baselineVersion, useProfiler, hardwareCounters, benchmarkType) =>
{
var config = new ManualConfig();
var job = Job.Default;

if (!string.IsNullOrEmpty(baselineVersion))
if (baselineVersion is not null)
{
config.AddJob(job
.WithNuGet(new NuGetReferenceList
{
new("AsmResolver", baselineVersion),
new("AsmResolver.PE.File", baselineVersion),
new("AsmResolver.PE", baselineVersion),
new("AsmResolver.PE.Win32Resources", baselineVersion),
new("AsmResolver.DotNet", baselineVersion),
new("AsmResolver.DotNet.Dynamic", baselineVersion),
}).WithId(baselineVersion)
.WithMsBuildArguments($"/p:PackagesBaselineVersion={baselineVersion}").WithId(baselineVersion)
.AsBaseline());
}

config.AddExporter(DefaultConfig.Instance.GetExporters().ToArray());
config.AddLogger(DefaultConfig.Instance.GetLoggers().ToArray());
config.AddColumnProvider(DefaultConfig.Instance.GetColumnProviders().ToArray());
config.HideColumns("NuGetReferences");
config.HideColumns("Arguments");
config.AddJob(job);

if (string.IsNullOrEmpty(benchmarkType))
if (hardwareCounters)
{
config.AddHardwareCounters(
HardwareCounter.CacheMisses,
HardwareCounter.BranchMispredictions,
HardwareCounter.InstructionRetired
);
}
else if (useProfiler)
{
config.AddDiagnoser(EventPipeProfiler.Default);
}

if (benchmarkType is null)
{
BenchmarkRunner.Run(Assembly.GetExecutingAssembly(), config);
}
else if (Type.GetType($"AsmResolver.Benchmarks.{benchmarkType}") is { } type)
{
BenchmarkRunner.Run(type, config);
}
else
{
Console.Error.WriteLine($"Could not find benchmark {benchmarkType}.");
Console.Error.WriteLine("Available benchmarks:");
var assemblyTypes = Assembly.GetExecutingAssembly().GetTypes();
foreach (var asemblyType in assemblyTypes)
{
var typeMethods = asemblyType.GetMethods();
foreach (var typeMethod in typeMethods)
{
var benchmarkAttribute = typeMethod.GetCustomAttribute<BenchmarkAttribute>();
if (benchmarkAttribute is not null)
{
var typeName = asemblyType.Name;
Console.Error.WriteLine($" {typeName}");
break;
}
}
}
}

}, baselineVersionOption, onlyOption);
}, baselineVersionOption, useProfilerOption, hardwareCountersOption, onlyTypeOption);

return await root.InvokeAsync(args);
}
Expand Down
Loading