diff --git a/samples/BenchmarkDotNet.Samples/IntroCategories.cs b/samples/BenchmarkDotNet.Samples/IntroCategories.cs index 3319d8614c..baa93852e7 100644 --- a/samples/BenchmarkDotNet.Samples/IntroCategories.cs +++ b/samples/BenchmarkDotNet.Samples/IntroCategories.cs @@ -4,6 +4,7 @@ namespace BenchmarkDotNet.Samples { [DryJob] + [UseLocalJobOnly] [CategoriesColumn] [BenchmarkCategory("Awesome")] [AnyCategoriesFilter("A", "1")] diff --git a/samples/BenchmarkDotNet.Samples/IntroCategoryDiscoverer.cs b/samples/BenchmarkDotNet.Samples/IntroCategoryDiscoverer.cs index 92383eb2c8..44f2e5facc 100644 --- a/samples/BenchmarkDotNet.Samples/IntroCategoryDiscoverer.cs +++ b/samples/BenchmarkDotNet.Samples/IntroCategoryDiscoverer.cs @@ -8,6 +8,7 @@ namespace BenchmarkDotNet.Samples { [DryJob] + [UseLocalJobOnly] [CategoriesColumn] [CustomCategoryDiscoverer] public class IntroCategoryDiscoverer diff --git a/samples/BenchmarkDotNet.Samples/IntroColdStart.cs b/samples/BenchmarkDotNet.Samples/IntroColdStart.cs index 3a8e8c9b96..8cdadd9e3d 100644 --- a/samples/BenchmarkDotNet.Samples/IntroColdStart.cs +++ b/samples/BenchmarkDotNet.Samples/IntroColdStart.cs @@ -6,6 +6,7 @@ namespace BenchmarkDotNet.Samples { [SimpleJob(RunStrategy.ColdStart, iterationCount: 5)] + [UseLocalJobOnly] [MinColumn, MaxColumn, MeanColumn, MedianColumn] public class IntroColdStart { diff --git a/samples/BenchmarkDotNet.Samples/IntroConfigSource.cs b/samples/BenchmarkDotNet.Samples/IntroConfigSource.cs index ad0a5cd505..7dc3b79f84 100644 --- a/samples/BenchmarkDotNet.Samples/IntroConfigSource.cs +++ b/samples/BenchmarkDotNet.Samples/IntroConfigSource.cs @@ -9,6 +9,7 @@ namespace BenchmarkDotNet.Samples { [MyConfigSource(Jit.LegacyJit, Jit.RyuJit)] + [UseLocalJobOnly] public class IntroConfigSource { /// diff --git a/samples/BenchmarkDotNet.Samples/IntroCultureInfo.cs b/samples/BenchmarkDotNet.Samples/IntroCultureInfo.cs index aa44212db8..1fcef603e8 100644 --- a/samples/BenchmarkDotNet.Samples/IntroCultureInfo.cs +++ b/samples/BenchmarkDotNet.Samples/IntroCultureInfo.cs @@ -7,6 +7,7 @@ namespace BenchmarkDotNet.Samples { [Config(typeof(Config))] [ShortRunJob] + [UseLocalJobOnly] public class IntroCultureInfo { private class Config : ManualConfig diff --git a/samples/BenchmarkDotNet.Samples/IntroCustomMono.cs b/samples/BenchmarkDotNet.Samples/IntroCustomMono.cs index fd46b09530..1628dd5c29 100644 --- a/samples/BenchmarkDotNet.Samples/IntroCustomMono.cs +++ b/samples/BenchmarkDotNet.Samples/IntroCustomMono.cs @@ -10,6 +10,7 @@ namespace BenchmarkDotNet.Samples [MonoJob("Mono x64", @"C:\Program Files\Mono\bin\mono.exe")] [MonoJob("Mono x86", @"C:\Program Files (x86)\Mono\bin\mono.exe")] + [UseLocalJobOnly] public class IntroCustomMono { [Benchmark] @@ -22,6 +23,7 @@ public void Foo() // *** Object Style *** [Config(typeof(Config))] + [UseLocalJobOnly] public class IntroCustomMonoObjectStyle { private class Config : ManualConfig @@ -45,6 +47,7 @@ public void Foo() // ** Object Style, Using AOT ** [Config(typeof(Config))] + [UseLocalJobOnly] public class IntroCustomMonoObjectStyleAot { private class Config : ManualConfig diff --git a/samples/BenchmarkDotNet.Samples/IntroCustomMonoArguments.cs b/samples/BenchmarkDotNet.Samples/IntroCustomMonoArguments.cs index 16de2308d7..afc145c6fc 100644 --- a/samples/BenchmarkDotNet.Samples/IntroCustomMonoArguments.cs +++ b/samples/BenchmarkDotNet.Samples/IntroCustomMonoArguments.cs @@ -6,6 +6,7 @@ namespace BenchmarkDotNet.Samples { [Config(typeof(ConfigWithCustomArguments))] + [UseLocalJobOnly] public class IntroCustomMonoArguments { public class ConfigWithCustomArguments : ManualConfig diff --git a/samples/BenchmarkDotNet.Samples/IntroDisassemblyAllJits.cs b/samples/BenchmarkDotNet.Samples/IntroDisassemblyAllJits.cs index 8d16970d76..d791b4a956 100644 --- a/samples/BenchmarkDotNet.Samples/IntroDisassemblyAllJits.cs +++ b/samples/BenchmarkDotNet.Samples/IntroDisassemblyAllJits.cs @@ -7,6 +7,7 @@ namespace BenchmarkDotNet.Samples { [Config(typeof(MultipleJits))] + [UseLocalJobOnly] public class IntroDisassemblyAllJits { public class MultipleJits : ManualConfig diff --git a/samples/BenchmarkDotNet.Samples/IntroDisassemblyDry.cs b/samples/BenchmarkDotNet.Samples/IntroDisassemblyDry.cs index c83fd44546..306d237cef 100644 --- a/samples/BenchmarkDotNet.Samples/IntroDisassemblyDry.cs +++ b/samples/BenchmarkDotNet.Samples/IntroDisassemblyDry.cs @@ -4,6 +4,7 @@ namespace BenchmarkDotNet.Samples { [DisassemblyDiagnoser(maxDepth: 3)] [DryJob] + [UseLocalJobOnly] public class IntroDisassemblyDry { [Benchmark] diff --git a/samples/BenchmarkDotNet.Samples/IntroDisassemblyRyuJit.cs b/samples/BenchmarkDotNet.Samples/IntroDisassemblyRyuJit.cs index 0d41d2c924..fd6c3c237f 100644 --- a/samples/BenchmarkDotNet.Samples/IntroDisassemblyRyuJit.cs +++ b/samples/BenchmarkDotNet.Samples/IntroDisassemblyRyuJit.cs @@ -5,6 +5,7 @@ namespace BenchmarkDotNet.Samples { [DisassemblyDiagnoser(printSource: true)] [RyuJitX64Job] + [UseLocalJobOnly] public class IntroDisassemblyRyuJit { private int[] field = Enumerable.Range(0, 100).ToArray(); diff --git a/samples/BenchmarkDotNet.Samples/IntroDotMemoryDiagnoser.cs b/samples/BenchmarkDotNet.Samples/IntroDotMemoryDiagnoser.cs index 5bdbb8dbc7..1c0ad68782 100644 --- a/samples/BenchmarkDotNet.Samples/IntroDotMemoryDiagnoser.cs +++ b/samples/BenchmarkDotNet.Samples/IntroDotMemoryDiagnoser.cs @@ -8,6 +8,7 @@ namespace BenchmarkDotNet.Samples [DotMemoryDiagnoser] [SimpleJob] // external-process execution [InProcess] // in-process execution + [UseLocalJobOnly] public class IntroDotMemoryDiagnoser { [Params(1024)] diff --git a/samples/BenchmarkDotNet.Samples/IntroDotTraceDiagnoser.cs b/samples/BenchmarkDotNet.Samples/IntroDotTraceDiagnoser.cs index 047e6ee059..2c985f998a 100644 --- a/samples/BenchmarkDotNet.Samples/IntroDotTraceDiagnoser.cs +++ b/samples/BenchmarkDotNet.Samples/IntroDotTraceDiagnoser.cs @@ -8,6 +8,7 @@ namespace BenchmarkDotNet.Samples [DotTraceDiagnoser] [SimpleJob] // external-process execution [InProcess] // in-process execution + [UseLocalJobOnly] public class IntroDotTraceDiagnoser { [Benchmark] diff --git a/samples/BenchmarkDotNet.Samples/IntroEnvVars.cs b/samples/BenchmarkDotNet.Samples/IntroEnvVars.cs index 66f5197119..d2107103d1 100644 --- a/samples/BenchmarkDotNet.Samples/IntroEnvVars.cs +++ b/samples/BenchmarkDotNet.Samples/IntroEnvVars.cs @@ -6,6 +6,7 @@ namespace BenchmarkDotNet.Samples { [Config(typeof(ConfigWithCustomEnvVars))] + [UseLocalJobOnly] public class IntroEnvVars { private class ConfigWithCustomEnvVars : ManualConfig diff --git a/samples/BenchmarkDotNet.Samples/IntroEventPipeProfiler.cs b/samples/BenchmarkDotNet.Samples/IntroEventPipeProfiler.cs index 3e754c3a4b..32bef14c94 100644 --- a/samples/BenchmarkDotNet.Samples/IntroEventPipeProfiler.cs +++ b/samples/BenchmarkDotNet.Samples/IntroEventPipeProfiler.cs @@ -5,6 +5,7 @@ namespace BenchmarkDotNet.Samples { [ShortRunJob] + [UseLocalJobOnly] [EventPipeProfiler(EventPipeProfile.CpuSampling)] public class IntroEventPipeProfiler { diff --git a/samples/BenchmarkDotNet.Samples/IntroEventPipeProfilerAdvanced.cs b/samples/BenchmarkDotNet.Samples/IntroEventPipeProfilerAdvanced.cs index 92ab1af703..7ae37682e6 100644 --- a/samples/BenchmarkDotNet.Samples/IntroEventPipeProfilerAdvanced.cs +++ b/samples/BenchmarkDotNet.Samples/IntroEventPipeProfilerAdvanced.cs @@ -11,6 +11,7 @@ namespace BenchmarkDotNet.Samples { [Config(typeof(CustomConfig))] + [UseLocalJobOnly] public class IntroEventPipeProfilerAdvanced { private class CustomConfig : ManualConfig diff --git a/samples/BenchmarkDotNet.Samples/IntroExport.cs b/samples/BenchmarkDotNet.Samples/IntroExport.cs index 40fce0481b..af7dbf3903 100644 --- a/samples/BenchmarkDotNet.Samples/IntroExport.cs +++ b/samples/BenchmarkDotNet.Samples/IntroExport.cs @@ -6,6 +6,7 @@ namespace BenchmarkDotNet.Samples { [ShortRunJob] [MediumRunJob] + [UseLocalJobOnly] [KeepBenchmarkFiles] [AsciiDocExporter] diff --git a/samples/BenchmarkDotNet.Samples/IntroExportJson.cs b/samples/BenchmarkDotNet.Samples/IntroExportJson.cs index b70085d976..c974b0a436 100644 --- a/samples/BenchmarkDotNet.Samples/IntroExportJson.cs +++ b/samples/BenchmarkDotNet.Samples/IntroExportJson.cs @@ -8,6 +8,7 @@ namespace BenchmarkDotNet.Samples // *** Attribute style *** [DryJob] + [UseLocalJobOnly] [JsonExporterAttribute.Brief] [JsonExporterAttribute.Full] [JsonExporterAttribute.BriefCompressed] diff --git a/samples/BenchmarkDotNet.Samples/IntroExportXml.cs b/samples/BenchmarkDotNet.Samples/IntroExportXml.cs index 8ffd198ee5..ea1b646d9c 100644 --- a/samples/BenchmarkDotNet.Samples/IntroExportXml.cs +++ b/samples/BenchmarkDotNet.Samples/IntroExportXml.cs @@ -4,6 +4,7 @@ namespace BenchmarkDotNet.Samples { [DryJob] + [UseLocalJobOnly] [XmlExporterAttribute.Brief] [XmlExporterAttribute.Full] [XmlExporterAttribute.BriefCompressed] diff --git a/samples/BenchmarkDotNet.Samples/IntroFilters.cs b/samples/BenchmarkDotNet.Samples/IntroFilters.cs index a70ca9e46b..703f54bf4d 100644 --- a/samples/BenchmarkDotNet.Samples/IntroFilters.cs +++ b/samples/BenchmarkDotNet.Samples/IntroFilters.cs @@ -6,6 +6,7 @@ namespace BenchmarkDotNet.Samples { [DryJob] + [UseLocalJobOnly] [Config(typeof(Config))] public class IntroFilters { diff --git a/samples/BenchmarkDotNet.Samples/IntroGcMode.cs b/samples/BenchmarkDotNet.Samples/IntroGcMode.cs index c71d175e91..c0bd2ba009 100644 --- a/samples/BenchmarkDotNet.Samples/IntroGcMode.cs +++ b/samples/BenchmarkDotNet.Samples/IntroGcMode.cs @@ -7,6 +7,7 @@ namespace BenchmarkDotNet.Samples { [Config(typeof(Config))] + [UseLocalJobOnly] [Orderer(SummaryOrderPolicy.FastestToSlowest)] [MemoryDiagnoser] public class IntroGcMode diff --git a/samples/BenchmarkDotNet.Samples/IntroInProcess.cs b/samples/BenchmarkDotNet.Samples/IntroInProcess.cs index ee4d64a7a7..205f19f522 100644 --- a/samples/BenchmarkDotNet.Samples/IntroInProcess.cs +++ b/samples/BenchmarkDotNet.Samples/IntroInProcess.cs @@ -8,6 +8,7 @@ namespace BenchmarkDotNet.Samples { [Config(typeof(Config))] + [UseLocalJobOnly] [Orderer(SummaryOrderPolicy.FastestToSlowest)] [MemoryDiagnoser] public class IntroInProcess diff --git a/samples/BenchmarkDotNet.Samples/IntroInProcessWrongEnv.cs b/samples/BenchmarkDotNet.Samples/IntroInProcessWrongEnv.cs index e5400d60cb..cff1fe5c81 100644 --- a/samples/BenchmarkDotNet.Samples/IntroInProcessWrongEnv.cs +++ b/samples/BenchmarkDotNet.Samples/IntroInProcessWrongEnv.cs @@ -11,6 +11,7 @@ namespace BenchmarkDotNet.Samples { [Config(typeof(Config))] + [UseLocalJobOnly] [Orderer(SummaryOrderPolicy.FastestToSlowest)] [MemoryDiagnoser] public class IntroInProcessWrongEnv diff --git a/samples/BenchmarkDotNet.Samples/IntroJobBaseline.cs b/samples/BenchmarkDotNet.Samples/IntroJobBaseline.cs index eb3142422b..b98c9b4e13 100644 --- a/samples/BenchmarkDotNet.Samples/IntroJobBaseline.cs +++ b/samples/BenchmarkDotNet.Samples/IntroJobBaseline.cs @@ -6,6 +6,7 @@ namespace BenchmarkDotNet.Samples [SimpleJob(runtimeMoniker: RuntimeMoniker.Net462, baseline: true)] [SimpleJob(runtimeMoniker: RuntimeMoniker.Mono)] [SimpleJob(runtimeMoniker: RuntimeMoniker.Net50)] + [UseLocalJobOnly] public class IntroJobBaseline { [Benchmark] diff --git a/samples/BenchmarkDotNet.Samples/IntroJoin.cs b/samples/BenchmarkDotNet.Samples/IntroJoin.cs index 8c895bba42..54144db981 100644 --- a/samples/BenchmarkDotNet.Samples/IntroJoin.cs +++ b/samples/BenchmarkDotNet.Samples/IntroJoin.cs @@ -6,6 +6,7 @@ namespace BenchmarkDotNet.Samples // Run BenchmarkSwitcher with arguments: "--join --category=IntroJoinA" [DryJob] + [UseLocalJobOnly] public class IntroJoin1 { [Benchmark] @@ -18,6 +19,7 @@ public class IntroJoin1 } [DryJob] + [UseLocalJobOnly] public class IntroJoin2 { [Benchmark] diff --git a/samples/BenchmarkDotNet.Samples/IntroLargeAddressAware.cs b/samples/BenchmarkDotNet.Samples/IntroLargeAddressAware.cs index 9751c1837b..fcc86bdf26 100644 --- a/samples/BenchmarkDotNet.Samples/IntroLargeAddressAware.cs +++ b/samples/BenchmarkDotNet.Samples/IntroLargeAddressAware.cs @@ -9,6 +9,7 @@ namespace BenchmarkDotNet.Samples { [MemoryDiagnoser] [Config(typeof(Config))] + [UseLocalJobOnly] public class IntroLargeAddressAware { private class Config : ManualConfig diff --git a/samples/BenchmarkDotNet.Samples/IntroMemoryRandomization.cs b/samples/BenchmarkDotNet.Samples/IntroMemoryRandomization.cs index 5a6230488a..2dad4400e6 100644 --- a/samples/BenchmarkDotNet.Samples/IntroMemoryRandomization.cs +++ b/samples/BenchmarkDotNet.Samples/IntroMemoryRandomization.cs @@ -3,6 +3,7 @@ namespace BenchmarkDotNet.Samples { + [UseLocalJobOnly] public class IntroMemoryRandomization { [Params(512 * 4)] diff --git a/samples/BenchmarkDotNet.Samples/IntroMonitoring.cs b/samples/BenchmarkDotNet.Samples/IntroMonitoring.cs index 92ca8558b6..d6621cf28e 100644 --- a/samples/BenchmarkDotNet.Samples/IntroMonitoring.cs +++ b/samples/BenchmarkDotNet.Samples/IntroMonitoring.cs @@ -6,6 +6,7 @@ namespace BenchmarkDotNet.Samples { [SimpleJob(RunStrategy.Monitoring, iterationCount: 10, id: "MonitoringJob")] + [UseLocalJobOnly] [MinColumn, Q1Column, Q3Column, MaxColumn] public class IntroMonitoring { diff --git a/samples/BenchmarkDotNet.Samples/IntroMultimodal.cs b/samples/BenchmarkDotNet.Samples/IntroMultimodal.cs index 9cad65e36a..9792d8d407 100644 --- a/samples/BenchmarkDotNet.Samples/IntroMultimodal.cs +++ b/samples/BenchmarkDotNet.Samples/IntroMultimodal.cs @@ -7,6 +7,7 @@ namespace BenchmarkDotNet.Samples { [MValueColumn] [SimpleJob(RunStrategy.Throughput, 1, 0, -1, 1, "MyJob")] + [UseLocalJobOnly] public class IntroMultimodal { private readonly Random rnd = new Random(42); diff --git a/samples/BenchmarkDotNet.Samples/IntroNativeMemory.cs b/samples/BenchmarkDotNet.Samples/IntroNativeMemory.cs index 77d50de637..c2c2aab8bf 100644 --- a/samples/BenchmarkDotNet.Samples/IntroNativeMemory.cs +++ b/samples/BenchmarkDotNet.Samples/IntroNativeMemory.cs @@ -8,6 +8,7 @@ namespace BenchmarkDotNet.Samples { [ShortRunJob] + [UseLocalJobOnly] [NativeMemoryProfiler] [MemoryDiagnoser] public class IntroNativeMemory diff --git a/samples/BenchmarkDotNet.Samples/IntroNuGet.cs b/samples/BenchmarkDotNet.Samples/IntroNuGet.cs index 75c1f7505a..86991389cb 100644 --- a/samples/BenchmarkDotNet.Samples/IntroNuGet.cs +++ b/samples/BenchmarkDotNet.Samples/IntroNuGet.cs @@ -14,6 +14,7 @@ namespace BenchmarkDotNet.Samples /// Only supported with CsProj toolchains. /// [Config(typeof(Config))] + [UseLocalJobOnly] public class IntroNuGet { // Setup your csproj like this: diff --git a/samples/BenchmarkDotNet.Samples/IntroOrderAttr.cs b/samples/BenchmarkDotNet.Samples/IntroOrderAttr.cs index 3bda6be82e..8d79fc6cd3 100644 --- a/samples/BenchmarkDotNet.Samples/IntroOrderAttr.cs +++ b/samples/BenchmarkDotNet.Samples/IntroOrderAttr.cs @@ -6,6 +6,7 @@ namespace BenchmarkDotNet.Samples { [Orderer(SummaryOrderPolicy.FastestToSlowest, MethodOrderPolicy.Declared, jobOrderPolicy: JobOrderPolicy.Numeric)] [DryJob] + [UseLocalJobOnly] public class IntroOrderAttr { [Params(1, 2, 3)] diff --git a/samples/BenchmarkDotNet.Samples/IntroOrderManual.cs b/samples/BenchmarkDotNet.Samples/IntroOrderManual.cs index f2b685eadc..32b7a008ff 100644 --- a/samples/BenchmarkDotNet.Samples/IntroOrderManual.cs +++ b/samples/BenchmarkDotNet.Samples/IntroOrderManual.cs @@ -12,6 +12,7 @@ namespace BenchmarkDotNet.Samples { [Config(typeof(Config))] [DryJob] + [UseLocalJobOnly] [RankColumn] public class IntroOrderManual { diff --git a/samples/BenchmarkDotNet.Samples/IntroOutliers.cs b/samples/BenchmarkDotNet.Samples/IntroOutliers.cs index 8a65191095..32009920be 100644 --- a/samples/BenchmarkDotNet.Samples/IntroOutliers.cs +++ b/samples/BenchmarkDotNet.Samples/IntroOutliers.cs @@ -7,6 +7,7 @@ namespace BenchmarkDotNet.Samples { [Config(typeof(Config))] + [UseLocalJobOnly] public class IntroOutliers { private class Config : ManualConfig diff --git a/samples/BenchmarkDotNet.Samples/IntroParamsAllValues.cs b/samples/BenchmarkDotNet.Samples/IntroParamsAllValues.cs index f082a64af4..ba2e95716f 100644 --- a/samples/BenchmarkDotNet.Samples/IntroParamsAllValues.cs +++ b/samples/BenchmarkDotNet.Samples/IntroParamsAllValues.cs @@ -4,6 +4,7 @@ namespace BenchmarkDotNet.Samples { [DryJob] + [UseLocalJobOnly] public class IntroParamsAllValues { public enum CustomEnum diff --git a/samples/BenchmarkDotNet.Samples/IntroPercentiles.cs b/samples/BenchmarkDotNet.Samples/IntroPercentiles.cs index d6886e62ba..ed29890590 100644 --- a/samples/BenchmarkDotNet.Samples/IntroPercentiles.cs +++ b/samples/BenchmarkDotNet.Samples/IntroPercentiles.cs @@ -9,6 +9,7 @@ namespace BenchmarkDotNet.Samples { // Using percentiles for adequate timings representation [Config(typeof(Config))] + [UseLocalJobOnly] [SimpleJob(RunStrategy.ColdStart, launchCount: 4, warmupCount: 3, iterationCount: 20, id: "MyJob")] public class IntroPercentiles diff --git a/samples/BenchmarkDotNet.Samples/IntroPowerPlan.cs b/samples/BenchmarkDotNet.Samples/IntroPowerPlan.cs index de435670de..778fc5f7fb 100644 --- a/samples/BenchmarkDotNet.Samples/IntroPowerPlan.cs +++ b/samples/BenchmarkDotNet.Samples/IntroPowerPlan.cs @@ -7,6 +7,7 @@ namespace BenchmarkDotNet.Samples { [Config(typeof(Config))] + [UseLocalJobOnly] public class IntroPowerPlan { private class Config : ManualConfig diff --git a/samples/BenchmarkDotNet.Samples/IntroRankColumn.cs b/samples/BenchmarkDotNet.Samples/IntroRankColumn.cs index 1127e93bf1..ed3a193312 100644 --- a/samples/BenchmarkDotNet.Samples/IntroRankColumn.cs +++ b/samples/BenchmarkDotNet.Samples/IntroRankColumn.cs @@ -6,6 +6,7 @@ namespace BenchmarkDotNet.Samples { [ShortRunJob] + [UseLocalJobOnly] [Orderer(SummaryOrderPolicy.FastestToSlowest)] [RankColumn(NumeralSystem.Arabic)] [RankColumn(NumeralSystem.Roman)] diff --git a/samples/BenchmarkDotNet.Samples/IntroRatioSD.cs b/samples/BenchmarkDotNet.Samples/IntroRatioSD.cs index bc617529f5..9ba370a18e 100644 --- a/samples/BenchmarkDotNet.Samples/IntroRatioSD.cs +++ b/samples/BenchmarkDotNet.Samples/IntroRatioSD.cs @@ -9,6 +9,7 @@ namespace BenchmarkDotNet.Samples [Outliers(OutlierMode.DontRemove)] // Skip jitting, pilot, warmup; measure 10 iterations [SimpleJob(RunStrategy.Monitoring, iterationCount: 10, invocationCount: 1)] + [UseLocalJobOnly] public class IntroRatioSD { private int counter; diff --git a/samples/BenchmarkDotNet.Samples/IntroRatioStyle.cs b/samples/BenchmarkDotNet.Samples/IntroRatioStyle.cs index d377329b1f..9c50413c2e 100644 --- a/samples/BenchmarkDotNet.Samples/IntroRatioStyle.cs +++ b/samples/BenchmarkDotNet.Samples/IntroRatioStyle.cs @@ -7,6 +7,7 @@ namespace BenchmarkDotNet.Samples { [ShortRunJob, Config(typeof(Config))] + [UseLocalJobOnly] public class IntroRatioStyle { [Benchmark(Baseline = true)] diff --git a/samples/BenchmarkDotNet.Samples/IntroSetupCleanupIteration.cs b/samples/BenchmarkDotNet.Samples/IntroSetupCleanupIteration.cs index 3ef8fbad9b..4fd5a702f5 100644 --- a/samples/BenchmarkDotNet.Samples/IntroSetupCleanupIteration.cs +++ b/samples/BenchmarkDotNet.Samples/IntroSetupCleanupIteration.cs @@ -6,6 +6,7 @@ namespace BenchmarkDotNet.Samples { [SimpleJob(RunStrategy.Monitoring, launchCount: 1, warmupCount: 2, iterationCount: 3)] + [UseLocalJobOnly] public class IntroSetupCleanupIteration { private int setupCounter; diff --git a/samples/BenchmarkDotNet.Samples/IntroSetupCleanupTarget.cs b/samples/BenchmarkDotNet.Samples/IntroSetupCleanupTarget.cs index b62c28a052..b24bdf3844 100644 --- a/samples/BenchmarkDotNet.Samples/IntroSetupCleanupTarget.cs +++ b/samples/BenchmarkDotNet.Samples/IntroSetupCleanupTarget.cs @@ -6,6 +6,7 @@ namespace BenchmarkDotNet.Samples { [SimpleJob(RunStrategy.Monitoring, launchCount: 0, warmupCount: 0, iterationCount: 1)] + [UseLocalJobOnly] public class IntroSetupCleanupTarget { [GlobalSetup(Target = nameof(BenchmarkA))] diff --git a/samples/BenchmarkDotNet.Samples/IntroStatisticalTesting.cs b/samples/BenchmarkDotNet.Samples/IntroStatisticalTesting.cs index 6351281aa6..8a3e80e479 100644 --- a/samples/BenchmarkDotNet.Samples/IntroStatisticalTesting.cs +++ b/samples/BenchmarkDotNet.Samples/IntroStatisticalTesting.cs @@ -6,6 +6,7 @@ namespace BenchmarkDotNet.Samples [StatisticalTestColumn("500us")] [StatisticalTestColumn("3%")] [SimpleJob(warmupCount: 0, iterationCount: 5)] + [UseLocalJobOnly] public class IntroStatisticalTesting { [Benchmark] public void Sleep50() => Thread.Sleep(50); diff --git a/samples/BenchmarkDotNet.Samples/IntroStatisticsColumns.cs b/samples/BenchmarkDotNet.Samples/IntroStatisticsColumns.cs index 9d485f072d..3c6dda8214 100644 --- a/samples/BenchmarkDotNet.Samples/IntroStatisticsColumns.cs +++ b/samples/BenchmarkDotNet.Samples/IntroStatisticsColumns.cs @@ -5,6 +5,7 @@ namespace BenchmarkDotNet.Samples { [MediumRunJob, SkewnessColumn, KurtosisColumn] + [UseLocalJobOnly] public class IntroStatisticsColumns { private const int N = 10000; diff --git a/samples/BenchmarkDotNet.Samples/IntroTagColumn.cs b/samples/BenchmarkDotNet.Samples/IntroTagColumn.cs index 369f90c8b1..7a63346a55 100644 --- a/samples/BenchmarkDotNet.Samples/IntroTagColumn.cs +++ b/samples/BenchmarkDotNet.Samples/IntroTagColumn.cs @@ -8,6 +8,7 @@ namespace BenchmarkDotNet.Samples { // You can add custom tags per each method using Columns [Config(typeof(Config))] + [UseLocalJobOnly] public class IntroTagColumn { private class Config : ManualConfig diff --git a/samples/BenchmarkDotNet.Samples/IntroTailcall.cs b/samples/BenchmarkDotNet.Samples/IntroTailcall.cs index 82f3ac233d..3cd6eb6836 100644 --- a/samples/BenchmarkDotNet.Samples/IntroTailcall.cs +++ b/samples/BenchmarkDotNet.Samples/IntroTailcall.cs @@ -4,6 +4,7 @@ namespace BenchmarkDotNet.Samples { [Diagnostics.Windows.Configs.TailCallDiagnoser] [LegacyJitX86Job, LegacyJitX64Job, RyuJitX64Job] + [UseLocalJobOnly] public class IntroTailcall { [Benchmark] diff --git a/src/BenchmarkDotNet/Attributes/UseLocalJobOnlyAttribute.cs b/src/BenchmarkDotNet/Attributes/UseLocalJobOnlyAttribute.cs new file mode 100644 index 0000000000..b0a5981815 --- /dev/null +++ b/src/BenchmarkDotNet/Attributes/UseLocalJobOnlyAttribute.cs @@ -0,0 +1,19 @@ +using System; +using BenchmarkDotNet.Configs; +using JetBrains.Annotations; + +namespace BenchmarkDotNet.Attributes; + +[PublicAPI] +[AttributeUsage(AttributeTargets.Class)] +public class UseLocalJobOnlyAttribute : Attribute, IConfigSource +{ + public IConfig Config { get; } + + public UseLocalJobOnlyAttribute() + { + Config = ManualConfig.CreateEmpty(); + + // `WithUnionRule(ConfigUnionRule.UnionAndUseLocalJob)` is not set here. Because it's not used. + } +} diff --git a/src/BenchmarkDotNet/Configs/ConfigUnionRule.cs b/src/BenchmarkDotNet/Configs/ConfigUnionRule.cs index 37530baaa9..bfe97c80eb 100644 --- a/src/BenchmarkDotNet/Configs/ConfigUnionRule.cs +++ b/src/BenchmarkDotNet/Configs/ConfigUnionRule.cs @@ -2,6 +2,13 @@ { public enum ConfigUnionRule { - Union, AlwaysUseLocal, AlwaysUseGlobal + Union, + AlwaysUseLocal, + AlwaysUseGlobal, + + /// + /// Union global/local configs except for jobs. + /// + UnionAndUseLocalJob, } } \ No newline at end of file diff --git a/src/BenchmarkDotNet/Configs/ManualConfig.cs b/src/BenchmarkDotNet/Configs/ManualConfig.cs index af0f3d8d4e..67764ecc7f 100644 --- a/src/BenchmarkDotNet/Configs/ManualConfig.cs +++ b/src/BenchmarkDotNet/Configs/ManualConfig.cs @@ -273,6 +273,11 @@ public static ManualConfig Union(IConfig globalConfig, IConfig localConfig) manualConfig.Add(globalConfig); manualConfig.Add(localConfig); break; + case ConfigUnionRule.UnionAndUseLocalJob: + manualConfig.Add(globalConfig); + manualConfig.RemoveAllJobs(); + manualConfig.Add(localConfig); + break; default: throw new ArgumentOutOfRangeException(); } diff --git a/src/BenchmarkDotNet/Running/BenchmarkConverter.cs b/src/BenchmarkDotNet/Running/BenchmarkConverter.cs index 4a8e67e30d..38f0f85010 100644 --- a/src/BenchmarkDotNet/Running/BenchmarkConverter.cs +++ b/src/BenchmarkDotNet/Running/BenchmarkConverter.cs @@ -92,12 +92,31 @@ private static ImmutableConfig GetFullTypeConfig(Type type, IConfig? config) { config = config ?? DefaultConfig.Instance; - var typeAttributes = type.GetCustomAttributes(true).OfType(); var assemblyAttributes = type.Assembly.GetCustomAttributes().OfType(); - - foreach (var configFromAttribute in assemblyAttributes.Concat(typeAttributes)) + foreach (var configFromAttribute in assemblyAttributes) config = ManualConfig.Union(config, configFromAttribute.Config); + var typeAttributes = type.GetCustomAttributes(true).OfType().ToArray(); + if (typeAttributes.Any(x => x is UseLocalJobOnlyAttribute)) + { + // UseLocalJobOnlyAttribute can't be combined with other benchmark attribute that setting non-default UnionRule. + if (typeAttributes.Any(x => x.Config.UnionRule != ConfigUnionRule.Union)) + throw new InvalidBenchmarkDeclarationException($"{type.Name} using UseLocalJobOnlyAttribute, but other benchmar attributes setting another UnionRule."); + + // Aggregate attribute-based configs. + var typeConfig = ManualConfig.CreateEmpty(); + foreach (var configFromAttribute in typeAttributes) + typeConfig = ManualConfig.Union(typeConfig, configFromAttribute.Config); + + typeConfig.WithUnionRule(ConfigUnionRule.UnionAndUseLocalJob); + config = ManualConfig.Union(config, typeConfig); + } + else + { + foreach (var configFromAttribute in typeAttributes) + config = ManualConfig.Union(config, configFromAttribute.Config); + } + return ImmutableConfigBuilder.Create(config); }