Skip to content

Commit 6d27395

Browse files
authored
Improve BuildTimeout (#1906)
* don't try to pass build timeout to every builder, move it to IConfig so it can be always resolved at run time * implement timeout support for Roslyn toolchain * remove redundant WasmBuilder
1 parent 6ca6c66 commit 6d27395

25 files changed

+136
-130
lines changed

src/BenchmarkDotNet/Configs/DebugConfig.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ public abstract class DebugConfig : IConfig
6666
public IOrderer Orderer => DefaultOrderer.Instance;
6767
public SummaryStyle SummaryStyle => SummaryStyle.Default;
6868
public ConfigUnionRule UnionRule => ConfigUnionRule.Union;
69+
public TimeSpan BuildTimeout => DefaultConfig.Instance.BuildTimeout;
6970

7071
public string ArtifactsPath
7172
{

src/BenchmarkDotNet/Configs/DefaultConfig.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ public IEnumerable<IValidator> GetValidators()
7878

7979
public SummaryStyle SummaryStyle => SummaryStyle.Default;
8080

81+
public TimeSpan BuildTimeout => TimeSpan.FromSeconds(120);
82+
8183
public string ArtifactsPath
8284
{
8385
get

src/BenchmarkDotNet/Configs/IConfig.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Collections.Generic;
1+
using System;
2+
using System.Collections.Generic;
23
using System.Globalization;
34
using BenchmarkDotNet.Analysers;
45
using BenchmarkDotNet.Columns;
@@ -45,5 +46,10 @@ public interface IConfig
4546
/// a set of custom flags that can enable/disable various settings
4647
/// </summary>
4748
ConfigOptions Options { get; }
49+
50+
/// <summary>
51+
/// the auto-generated project build timeout
52+
/// </summary>
53+
TimeSpan BuildTimeout { get; }
4854
}
4955
}

src/BenchmarkDotNet/Configs/ImmutableConfig.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Collections.Generic;
1+
using System;
2+
using System.Collections.Generic;
23
using System.Collections.Immutable;
34
using System.Globalization;
45
using System.Linq;
@@ -48,7 +49,8 @@ internal ImmutableConfig(
4849
CultureInfo cultureInfo,
4950
IOrderer orderer,
5051
SummaryStyle summaryStyle,
51-
ConfigOptions options)
52+
ConfigOptions options,
53+
TimeSpan buildTimeout)
5254
{
5355
columnProviders = uniqueColumnProviders;
5456
loggers = uniqueLoggers;
@@ -66,6 +68,7 @@ internal ImmutableConfig(
6668
Orderer = orderer;
6769
SummaryStyle = summaryStyle;
6870
Options = options;
71+
BuildTimeout = buildTimeout;
6972
}
7073

7174
public ConfigUnionRule UnionRule { get; }
@@ -74,6 +77,7 @@ internal ImmutableConfig(
7477
public ConfigOptions Options { get; }
7578
[NotNull] public IOrderer Orderer { get; }
7679
public SummaryStyle SummaryStyle { get; }
80+
public TimeSpan BuildTimeout { get; }
7781

7882
public IEnumerable<IColumnProvider> GetColumnProviders() => columnProviders;
7983
public IEnumerable<IExporter> GetExporters() => exporters;

src/BenchmarkDotNet/Configs/ImmutableConfigBuilder.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ public static ImmutableConfig Create(IConfig source)
6565
source.CultureInfo,
6666
source.Orderer ?? DefaultOrderer.Instance,
6767
source.SummaryStyle ?? SummaryStyle.Default,
68-
source.Options
68+
source.Options,
69+
source.BuildTimeout
6970
);
7071
}
7172

src/BenchmarkDotNet/Configs/ManualConfig.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public class ManualConfig : IConfig
4848
[PublicAPI] public CultureInfo CultureInfo { get; set; }
4949
[PublicAPI] public IOrderer Orderer { get; set; }
5050
[PublicAPI] public SummaryStyle SummaryStyle { get; set; }
51+
[PublicAPI] public TimeSpan BuildTimeout { get; set; } = DefaultConfig.Instance.BuildTimeout;
5152

5253
public ManualConfig WithOption(ConfigOptions option, bool value)
5354
{
@@ -85,6 +86,12 @@ public ManualConfig WithOrderer(IOrderer orderer)
8586
return this;
8687
}
8788

89+
public ManualConfig WithBuildTimeout(TimeSpan buildTimeout)
90+
{
91+
BuildTimeout = buildTimeout;
92+
return this;
93+
}
94+
8895
[EditorBrowsable(EditorBrowsableState.Never)]
8996
[Obsolete("This method will soon be removed, please start using .AddColumn() instead.")]
9097
public void Add(params IColumn[] newColumns) => AddColumn(newColumns);
@@ -218,6 +225,7 @@ public void Add(IConfig config)
218225
SummaryStyle = config.SummaryStyle ?? SummaryStyle;
219226
logicalGroupRules.AddRange(config.GetLogicalGroupRules());
220227
Options |= config.Options;
228+
BuildTimeout = GetBuildTimeout(BuildTimeout, config.BuildTimeout);
221229
}
222230

223231
/// <summary>
@@ -263,5 +271,10 @@ public static ManualConfig Union(IConfig globalConfig, IConfig localConfig)
263271
}
264272
return manualConfig;
265273
}
274+
275+
private static TimeSpan GetBuildTimeout(TimeSpan current, TimeSpan other)
276+
=> current == DefaultConfig.Instance.BuildTimeout
277+
? other
278+
: TimeSpan.FromMilliseconds(Math.Max(current.TotalMilliseconds, other.TotalMilliseconds));
266279
}
267280
}

src/BenchmarkDotNet/ConsoleArguments/ConfigParser.cs

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,9 @@ private static IConfig CreateConfig(CommandLineOptions options, IConfig globalCo
245245
if (options.MaxParameterColumnWidth.HasValue)
246246
config.WithSummaryStyle(SummaryStyle.Default.WithMaxParameterColumnWidth(options.MaxParameterColumnWidth.Value));
247247

248+
if (options.TimeOutInSeconds.HasValue)
249+
config.WithBuildTimeout(TimeSpan.FromSeconds(options.TimeOutInSeconds.Value));
250+
248251
return config;
249252
}
250253

@@ -324,8 +327,6 @@ private static IEnumerable<Job> Expand(Job baseJob, CommandLineOptions options)
324327

325328
private static Job CreateJobForGivenRuntime(Job baseJob, string runtimeId, CommandLineOptions options)
326329
{
327-
TimeSpan? timeOut = options.TimeOutInSeconds.HasValue ? TimeSpan.FromSeconds(options.TimeOutInSeconds.Value) : default(TimeSpan?);
328-
329330
if (!TryParse(runtimeId, out RuntimeMoniker runtimeMoniker))
330331
{
331332
throw new InvalidOperationException("Impossible, already validated by the Validate method");
@@ -341,7 +342,7 @@ private static Job CreateJobForGivenRuntime(Job baseJob, string runtimeId, Comma
341342
case RuntimeMoniker.Net48:
342343
return baseJob
343344
.WithRuntime(runtimeMoniker.GetRuntime())
344-
.WithToolchain(CsProjClassicNetToolchain.From(runtimeId, options.RestorePath?.FullName, timeOut));
345+
.WithToolchain(CsProjClassicNetToolchain.From(runtimeId, options.RestorePath?.FullName));
345346
case RuntimeMoniker.NetCoreApp20:
346347
case RuntimeMoniker.NetCoreApp21:
347348
case RuntimeMoniker.NetCoreApp22:
@@ -355,7 +356,7 @@ private static Job CreateJobForGivenRuntime(Job baseJob, string runtimeId, Comma
355356
case RuntimeMoniker.Net70:
356357
return baseJob
357358
.WithRuntime(runtimeMoniker.GetRuntime())
358-
.WithToolchain(CsProjCoreToolchain.From(new NetCoreAppSettings(runtimeId, null, runtimeId, options.CliPath?.FullName, options.RestorePath?.FullName, timeOut)));
359+
.WithToolchain(CsProjCoreToolchain.From(new NetCoreAppSettings(runtimeId, null, runtimeId, options.CliPath?.FullName, options.RestorePath?.FullName)));
359360
case RuntimeMoniker.Mono:
360361
return baseJob.WithRuntime(new MonoRuntime("Mono", options.MonoPath?.FullName));
361362
case RuntimeMoniker.CoreRt20:
@@ -380,33 +381,30 @@ private static Job CreateJobForGivenRuntime(Job baseJob, string runtimeId, Comma
380381
else
381382
builder.UseCoreRtNuGet();
382383

383-
if (timeOut.HasValue)
384-
builder.Timeout(timeOut.Value);
385-
386384
var runtime = runtimeMoniker.GetRuntime();
387385
builder.TargetFrameworkMoniker(runtime.MsBuildMoniker);
388386

389387
return baseJob.WithRuntime(runtime).WithToolchain(builder.ToToolchain());
390388
case RuntimeMoniker.Wasm:
391-
return MakeWasmJob(baseJob, options, timeOut, RuntimeInformation.IsNetCore ? CoreRuntime.GetCurrentVersion().MsBuildMoniker : "net5.0");
389+
return MakeWasmJob(baseJob, options, RuntimeInformation.IsNetCore ? CoreRuntime.GetCurrentVersion().MsBuildMoniker : "net5.0");
392390
case RuntimeMoniker.WasmNet50:
393-
return MakeWasmJob(baseJob, options, timeOut, "net5.0");
391+
return MakeWasmJob(baseJob, options, "net5.0");
394392
case RuntimeMoniker.WasmNet60:
395-
return MakeWasmJob(baseJob, options, timeOut, "net6.0");
393+
return MakeWasmJob(baseJob, options, "net6.0");
396394
case RuntimeMoniker.WasmNet70:
397-
return MakeWasmJob(baseJob, options, timeOut, "net7.0");
395+
return MakeWasmJob(baseJob, options, "net7.0");
398396
case RuntimeMoniker.MonoAOTLLVM:
399-
return MakeMonoAOTLLVMJob(baseJob, options, timeOut, RuntimeInformation.IsNetCore ? CoreRuntime.GetCurrentVersion().MsBuildMoniker : "net6.0");
397+
return MakeMonoAOTLLVMJob(baseJob, options, RuntimeInformation.IsNetCore ? CoreRuntime.GetCurrentVersion().MsBuildMoniker : "net6.0");
400398
case RuntimeMoniker.MonoAOTLLVMNet60:
401-
return MakeMonoAOTLLVMJob(baseJob, options, timeOut, "net6.0");
399+
return MakeMonoAOTLLVMJob(baseJob, options, "net6.0");
402400
case RuntimeMoniker.MonoAOTLLVMNet70:
403-
return MakeMonoAOTLLVMJob(baseJob, options, timeOut, "net7.0");
401+
return MakeMonoAOTLLVMJob(baseJob, options, "net7.0");
404402
default:
405403
throw new NotSupportedException($"Runtime {runtimeId} is not supported");
406404
}
407405
}
408406

409-
private static Job MakeMonoAOTLLVMJob(Job baseJob, CommandLineOptions options, TimeSpan? timeOut, string msBuildMoniker)
407+
private static Job MakeMonoAOTLLVMJob(Job baseJob, CommandLineOptions options, string msBuildMoniker)
410408
{
411409
var monoAotLLVMRuntime = new MonoAotLLVMRuntime(aotCompilerPath: options.AOTCompilerPath, msBuildMoniker: msBuildMoniker);
412410

@@ -417,15 +415,14 @@ private static Job MakeMonoAOTLLVMJob(Job baseJob, CommandLineOptions options, T
417415
name: monoAotLLVMRuntime.Name,
418416
customDotNetCliPath: options.CliPath?.FullName,
419417
packagesPath: options.RestorePath?.FullName,
420-
timeout: timeOut ?? NetCoreAppSettings.DefaultBuildTimeout,
421418
customRuntimePack: options.CustomRuntimePack,
422419
aotCompilerPath: options.AOTCompilerPath.ToString(),
423420
aotCompilerMode: options.AOTCompilerMode));
424421

425422
return baseJob.WithRuntime(monoAotLLVMRuntime).WithToolchain(toolChain);
426423
}
427424

428-
private static Job MakeWasmJob(Job baseJob, CommandLineOptions options, TimeSpan? timeOut, string msBuildMoniker)
425+
private static Job MakeWasmJob(Job baseJob, CommandLineOptions options, string msBuildMoniker)
429426
{
430427
bool wasmAot = options.AOTCompilerMode == MonoAotCompilerMode.wasm;
431428

@@ -442,7 +439,6 @@ private static Job MakeWasmJob(Job baseJob, CommandLineOptions options, TimeSpan
442439
name: wasmRuntime.Name,
443440
customDotNetCliPath: options.CliPath?.FullName,
444441
packagesPath: options.RestorePath?.FullName,
445-
timeout: timeOut ?? NetCoreAppSettings.DefaultBuildTimeout,
446442
customRuntimePack: options.CustomRuntimePack,
447443
aotCompilerMode: options.AOTCompilerMode));
448444

src/BenchmarkDotNet/Running/BuildPartition.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,15 @@ public BuildPartition(BenchmarkBuildInfo[] benchmarks, IResolver resolver)
5656
|| (RepresentativeBenchmarkCase.Job.Infrastructure.TryGetToolchain(out var toolchain) && (toolchain is RoslynToolchain || toolchain is CsProjClassicNetToolchain));
5757

5858
public Runtime Runtime => RepresentativeBenchmarkCase.Job.Environment.HasValue(EnvironmentMode.RuntimeCharacteristic)
59-
? RepresentativeBenchmarkCase.Job.Environment.Runtime
60-
: RuntimeInformation.GetCurrentRuntime();
59+
? RepresentativeBenchmarkCase.Job.Environment.Runtime
60+
: RuntimeInformation.GetCurrentRuntime();
6161

6262
public bool IsCustomBuildConfiguration => BuildConfiguration != InfrastructureMode.ReleaseConfigurationName;
6363

64+
public TimeSpan Timeout => IsCoreRT && RepresentativeBenchmarkCase.Config.BuildTimeout == DefaultConfig.Instance.BuildTimeout
65+
? TimeSpan.FromMinutes(5) // downloading all CoreRT dependencies can take a LOT of time
66+
: RepresentativeBenchmarkCase.Config.BuildTimeout;
67+
6468
public override string ToString() => RepresentativeBenchmarkCase.Job.DisplayInfo;
6569

6670
private static string GetResolvedAssemblyLocation(Assembly assembly) =>

src/BenchmarkDotNet/Toolchains/CoreRt/CoreRtToolchain.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,12 @@ internal CoreRtToolchain(string displayName,
4545
string runtimeFrameworkVersion, string targetFrameworkMoniker, string runtimeIdentifier,
4646
string customDotNetCliPath, string packagesRestorePath,
4747
Dictionary<string, string> feeds, bool useNuGetClearTag, bool useTempFolderForRestore,
48-
TimeSpan timeout,
4948
bool rootAllApplicationAssemblies, bool ilcGenerateCompleteTypeMetadata, bool ilcGenerateStackTraceData)
5049
: base(displayName,
5150
new Generator(coreRtVersion, useCppCodeGenerator, runtimeFrameworkVersion, targetFrameworkMoniker, customDotNetCliPath,
5251
runtimeIdentifier, feeds, useNuGetClearTag, useTempFolderForRestore, packagesRestorePath,
5352
rootAllApplicationAssemblies, ilcGenerateCompleteTypeMetadata, ilcGenerateStackTraceData),
54-
new DotNetCliPublisher(customDotNetCliPath, GetExtraArguments(useCppCodeGenerator, runtimeIdentifier), GetEnvironmentVariables(ilcPath), timeout),
53+
new DotNetCliPublisher(customDotNetCliPath, GetExtraArguments(useCppCodeGenerator, runtimeIdentifier), GetEnvironmentVariables(ilcPath)),
5554
new Executor())
5655
{
5756
IlcPath = ilcPath;

src/BenchmarkDotNet/Toolchains/CoreRt/CoreRtToolchainBuilder.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,6 @@ public override IToolchain ToToolchain()
144144
feeds: Feeds,
145145
useNuGetClearTag: useNuGetClearTag,
146146
useTempFolderForRestore: useTempFolderForRestore,
147-
timeout: timeout ?? TimeSpan.FromMinutes(5), // downloading all CoreRT dependencies can take a LOT of time
148147
rootAllApplicationAssemblies: rootAllApplicationAssemblies,
149148
ilcGenerateCompleteTypeMetadata: ilcGenerateCompleteTypeMetadata,
150149
ilcGenerateStackTraceData: ilcGenerateStackTraceData

0 commit comments

Comments
 (0)