-
-
Notifications
You must be signed in to change notification settings - Fork 846
Expand file tree
/
Copy pathProgram.cs
More file actions
100 lines (82 loc) · 3.24 KB
/
Copy pathProgram.cs
File metadata and controls
100 lines (82 loc) · 3.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// Copyright (c) Autofac Project. All rights reserved.
// Licensed under the MIT License. See LICENSE in the project root for license information.
using BenchmarkDotNet.Jobs;
using BenchmarkDotNet.Running;
namespace Autofac.Benchmarks;
internal static class Program
{
internal static void Main(string[] args)
{
ArgumentNullException.ThrowIfNull(args);
var (filteredArgs, baselineVersion) = ExtractBaselineVersion(args);
// Usage:
//
// Just run the benchmark with the source code version of the project:
// dotnet run -c Release --project bench/Autofac.Benchmarks -- --filter *Benchmarks*
//
// Run the benchmark comparing the source code version to a specific package version:
// dotnet run -c Release --project bench/Autofac.Benchmarks -- --baseline-version 9.0.0 --filter *Benchmarks*
//
// Markdown tables are emitted by default; see BenchmarkDotNet.Artifacts/.../results/*.md.
var config = new BenchmarkConfig();
config.AddJob(
Job.Default
.WithId("Source"));
if (!string.IsNullOrWhiteSpace(baselineVersion))
{
config.AddJob(
Job.Default
.WithId($"Package-{baselineVersion}")
.AsBaseline()
.WithMsBuildArguments(
"/p:UseProjectReference=false",
$"/p:BaselinePackageVersion={baselineVersion}"));
}
Console.WriteLine($"Benchmark types configured: {BenchmarkSet.All.Length}");
new BenchmarkSwitcher(BenchmarkSet.All).Run(filteredArgs, config);
}
private static (string[] RemainingArgs, string? BaselineVersion) ExtractBaselineVersion(string[] args)
{
var forwarded = new List<string>(args.Length);
string? baseline = null;
for (var i = 0; i < args.Length; i++)
{
var arg = args[i];
if (TryMatchBaselineArg(arg, out var inlineVersion))
{
if (!string.IsNullOrWhiteSpace(inlineVersion))
{
baseline = inlineVersion;
continue;
}
if (i + 1 >= args.Length)
{
throw new ArgumentException("Missing version value for baseline argument.", nameof(args));
}
baseline = args[++i];
continue;
}
forwarded.Add(arg);
}
return (forwarded.ToArray(), baseline);
}
private static bool TryMatchBaselineArg(string arg, out string? valueFromAssignment)
{
valueFromAssignment = null;
static bool Matches(string candidate)
=> candidate.Equals("--baseline-version", StringComparison.OrdinalIgnoreCase) ||
candidate.Equals("--baselineVersion", StringComparison.OrdinalIgnoreCase);
var equalsIndex = arg.AsSpan().IndexOf('=');
if (equalsIndex >= 0)
{
var prefix = arg[..equalsIndex];
if (Matches(prefix))
{
valueFromAssignment = arg[(equalsIndex + 1)..];
return true;
}
return false;
}
return Matches(arg);
}
}