Skip to content

Commit da946f2

Browse files
committed
chore: add UseLocalJobOnlyAttribute and modify related codes
1 parent 0fc0cc1 commit da946f2

4 files changed

Lines changed: 54 additions & 4 deletions

File tree

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System;
2+
using BenchmarkDotNet.Configs;
3+
using JetBrains.Annotations;
4+
5+
namespace BenchmarkDotNet.Attributes;
6+
7+
[PublicAPI]
8+
[AttributeUsage(AttributeTargets.Class)]
9+
public class UseLocalJobOnlyAttribute : Attribute, IConfigSource
10+
{
11+
public IConfig Config { get; }
12+
13+
public UseLocalJobOnlyAttribute()
14+
{
15+
Config = ManualConfig.CreateEmpty();
16+
17+
// `WithUnionRule(ConfigUnionRule.UnionAndUseLocalJob)` is not set here. Because it's not used.
18+
}
19+
}

src/BenchmarkDotNet/Configs/ConfigUnionRule.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@
22
{
33
public enum ConfigUnionRule
44
{
5-
Union, AlwaysUseLocal, AlwaysUseGlobal
5+
Union,
6+
AlwaysUseLocal,
7+
AlwaysUseGlobal,
8+
9+
/// <summary>
10+
/// Union global/local configs except for jobs.
11+
/// </summary>
12+
UnionAndUseLocalJob,
613
}
714
}

src/BenchmarkDotNet/Configs/ManualConfig.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,11 @@ public static ManualConfig Union(IConfig globalConfig, IConfig localConfig)
273273
manualConfig.Add(globalConfig);
274274
manualConfig.Add(localConfig);
275275
break;
276+
case ConfigUnionRule.UnionAndUseLocalJob:
277+
manualConfig.Add(globalConfig);
278+
manualConfig.RemoveAllJobs();
279+
manualConfig.Add(localConfig);
280+
break;
276281
default:
277282
throw new ArgumentOutOfRangeException();
278283
}

src/BenchmarkDotNet/Running/BenchmarkConverter.cs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,31 @@ private static ImmutableConfig GetFullTypeConfig(Type type, IConfig? config)
9292
{
9393
config = config ?? DefaultConfig.Instance;
9494

95-
var typeAttributes = type.GetCustomAttributes(true).OfType<IConfigSource>();
9695
var assemblyAttributes = type.Assembly.GetCustomAttributes().OfType<IConfigSource>();
97-
98-
foreach (var configFromAttribute in assemblyAttributes.Concat(typeAttributes))
96+
foreach (var configFromAttribute in assemblyAttributes)
9997
config = ManualConfig.Union(config, configFromAttribute.Config);
10098

99+
var typeAttributes = type.GetCustomAttributes(true).OfType<IConfigSource>().ToArray();
100+
if (typeAttributes.Any(x => x is UseLocalJobOnlyAttribute))
101+
{
102+
// UseLocalJobOnlyAttribute.can't be combined with other benchmark attribute that set non-default UnionRule.
103+
if (typeAttributes.Any(x => x.Config.UnionRule != ConfigUnionRule.Union))
104+
throw new InvalidBenchmarkDeclarationException($"{type.Name} using UseLocalJobOnlyAttribute, but other benchmarks attribute set another UnionRule.");
105+
106+
// Aggregate attribute-based configs.
107+
var typeConfig = ManualConfig.CreateEmpty();
108+
foreach (var configFromAttribute in typeAttributes)
109+
typeConfig = ManualConfig.Union(typeConfig, configFromAttribute.Config);
110+
111+
typeConfig.WithUnionRule(ConfigUnionRule.UnionAndUseLocalJob);
112+
config = ManualConfig.Union(config, typeConfig);
113+
}
114+
else
115+
{
116+
foreach (var configFromAttribute in typeAttributes)
117+
config = ManualConfig.Union(config, configFromAttribute.Config);
118+
}
119+
101120
return ImmutableConfigBuilder.Create(config);
102121
}
103122

0 commit comments

Comments
 (0)