Skip to content

Commit 343a603

Browse files
committed
don't forget to JIT idle, #736
1 parent 6902ad1 commit 343a603

File tree

4 files changed

+23
-14
lines changed

4 files changed

+23
-14
lines changed

src/BenchmarkDotNet/Engines/EngineFactory.cs

+5-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,11 @@ private static bool ShouldExecuteOncePerIteration(Measurement jit, TimeInterval
6868
=> TimeInterval.FromNanoseconds(jit.GetAverageNanoseconds()) > iterationTime;
6969

7070
private static Measurement Jit(Engine engine)
71-
=> engine.RunIteration(new IterationData(IterationMode.Jit, index: -1, invokeCount: 1, unrollFactor: 1));
71+
{
72+
DeadCodeEliminationHelper.KeepAliveWithoutBoxing(engine.RunIteration(new IterationData(IterationMode.IdleJit, index: -1, invokeCount: 1, unrollFactor: 1))); // don't forget to JIT idle
73+
74+
return engine.RunIteration(new IterationData(IterationMode.Jit, index: -1, invokeCount: 1, unrollFactor: 1));
75+
}
7276

7377
private static Engine CreateEngine(EngineParameters engineParameters, IResolver resolver, Job job, Action<long> idle, Action<long> main)
7478
=> new Engine(

src/BenchmarkDotNet/Engines/IterationMode.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,6 @@ public enum IterationMode
4040
/// <summary>
4141
/// executing benchmark for the purpose of JIT wamup
4242
/// </summary>
43-
Jit
43+
Jit, IdleJit
4444
}
4545
}

src/BenchmarkDotNet/Engines/IterationModeExtensions.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@
33
public static class IterationModeExtensions
44
{
55
public static bool IsIdle(this IterationMode mode)
6-
=> mode == IterationMode.IdleWarmup || mode == IterationMode.IdleTarget;
6+
=> mode == IterationMode.IdleWarmup || mode == IterationMode.IdleTarget || mode == IterationMode.IdleJit;
77
}
88
}

tests/BenchmarkDotNet.Tests/Engine/EngineFactoryTests.cs

+16-11
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ namespace BenchmarkDotNet.Tests.Engine
99
{
1010
public class EngineFactoryTests
1111
{
12-
int timesBenchmarkCalled = 0, timesGlobalSetupCalled = 0, timesGlobalCleanupCalled = 0, timesIterationSetupCalled = 0, timesIterationCleanupCalled = 0;
12+
int timesBenchmarkCalled = 0, timesIdleCalled = 0;
13+
int timesGlobalSetupCalled = 0, timesGlobalCleanupCalled = 0, timesIterationSetupCalled = 0, timesIterationCleanupCalled = 0;
1314

1415
void GlobalSetup() => timesGlobalSetupCalled++;
1516
void IterationSetup() => timesIterationSetupCalled++;
@@ -25,19 +26,22 @@ void VeryTimeConsumingSingle(long _)
2526
}
2627

2728
void InstantSingle(long _) => timesBenchmarkCalled++;
28-
2929
void Instant16(long _) => timesBenchmarkCalled += 16;
30+
31+
void IdleSingle(long _) => timesIdleCalled++;
32+
void Idle16(long _) => timesIdleCalled += 16;
3033

3134
[Fact]
3235
public void VeryTimeConsumingBenchmarksAreExecutedOncePerIterationForDefaultSettings()
3336
{
34-
var engineParameters = CreateEngineParameters(singleAction: VeryTimeConsumingSingle, multiAction: Throwing, job: Job.Default);
37+
var engineParameters = CreateEngineParameters(mainSingleAction: VeryTimeConsumingSingle, mainMultiAction: Throwing, job: Job.Default);
3538

3639
var engine = new EngineFactory().CreateReadyToRun(engineParameters);
3740

3841
Assert.Equal(1, timesGlobalSetupCalled);
3942
Assert.Equal(1, timesIterationSetupCalled);
4043
Assert.Equal(1, timesBenchmarkCalled);
44+
Assert.Equal(1, timesIdleCalled);
4145
Assert.Equal(1, timesIterationCleanupCalled);
4246
Assert.Equal(0, timesGlobalCleanupCalled); // cleanup is called as part of dispode
4347

@@ -52,13 +56,14 @@ public void VeryTimeConsumingBenchmarksAreExecutedOncePerIterationForDefaultSett
5256
[Fact]
5357
public void ForJobsThatDontRequireJittingOnlyGlobalSetupIsCalled()
5458
{
55-
var engineParameters = CreateEngineParameters(singleAction: Throwing, multiAction: Throwing, job: Job.Dry);
59+
var engineParameters = CreateEngineParameters(mainSingleAction: Throwing, mainMultiAction: Throwing, job: Job.Dry);
5660

5761
var engine = new EngineFactory().CreateReadyToRun(engineParameters);
5862

5963
Assert.Equal(1, timesGlobalSetupCalled);
6064
Assert.Equal(0, timesIterationSetupCalled);
6165
Assert.Equal(0, timesBenchmarkCalled);
66+
Assert.Equal(0, timesIdleCalled);
6267
Assert.Equal(0, timesIterationCleanupCalled);
6368
Assert.Equal(0, timesGlobalCleanupCalled);
6469

@@ -70,13 +75,14 @@ public void ForJobsThatDontRequireJittingOnlyGlobalSetupIsCalled()
7075
[Fact]
7176
public void NonVeryTimeConsumingBenchmarksAreExecutedMoreThanOncePerIterationWithUnrollFactorForDefaultSettings()
7277
{
73-
var engineParameters = CreateEngineParameters(singleAction: InstantSingle, multiAction: Instant16, job: Job.Default);
78+
var engineParameters = CreateEngineParameters(mainSingleAction: InstantSingle, mainMultiAction: Instant16, job: Job.Default);
7479

7580
var engine = new EngineFactory().CreateReadyToRun(engineParameters);
7681

7782
Assert.Equal(1, timesGlobalSetupCalled);
7883
Assert.Equal(2, timesIterationSetupCalled); // once for single and & once for 16
7984
Assert.Equal(1 + 16, timesBenchmarkCalled);
85+
Assert.Equal(1 + 16, timesIdleCalled);
8086
Assert.Equal(2, timesIterationCleanupCalled); // once for single and & once for 16
8187
Assert.Equal(0, timesGlobalCleanupCalled);
8288

@@ -87,7 +93,7 @@ public void NonVeryTimeConsumingBenchmarksAreExecutedMoreThanOncePerIterationWit
8793
Assert.Equal(1, timesGlobalCleanupCalled);
8894
}
8995

90-
private EngineParameters CreateEngineParameters(Action<long> singleAction, Action<long> multiAction, Job job)
96+
private EngineParameters CreateEngineParameters(Action<long> mainSingleAction, Action<long> mainMultiAction, Job job)
9197
=> new EngineParameters
9298
{
9399
Dummy1Action = () => { },
@@ -96,13 +102,12 @@ private EngineParameters CreateEngineParameters(Action<long> singleAction, Actio
96102
GlobalSetupAction = GlobalSetup,
97103
GlobalCleanupAction = GlobalCleanup,
98104
Host = new ConsoleHost(TextWriter.Null, TextReader.Null),
99-
IdleMultiAction = _ => { },
100-
IdleSingleAction = _ => { },
105+
IdleMultiAction = Idle16,
106+
IdleSingleAction = IdleSingle,
101107
IterationCleanupAction = IterationCleanup,
102108
IterationSetupAction = IterationSetup,
103-
MainMultiAction = multiAction,
104-
MainSingleAction = singleAction,
105-
Resolver = EngineResolver.Instance,
109+
MainMultiAction = mainMultiAction,
110+
MainSingleAction = mainSingleAction,
106111
TargetJob = job
107112
};
108113
}

0 commit comments

Comments
 (0)