@@ -29,6 +29,7 @@ public IEngine CreateReadyToRun(EngineParameters engineParameters)
29
29
throw new ArgumentNullException ( nameof ( engineParameters . TargetJob ) ) ;
30
30
31
31
var resolver = new CompositeResolver ( BenchmarkRunner . DefaultResolver , EngineResolver . Instance ) ;
32
+ var unrollFactor = engineParameters . TargetJob . ResolveValue ( RunMode . UnrollFactorCharacteristic , resolver ) ;
32
33
33
34
engineParameters . GlobalSetupAction ? . Invoke ( ) ;
34
35
@@ -45,7 +46,7 @@ public IEngine CreateReadyToRun(EngineParameters engineParameters)
45
46
var singleActionEngine = CreateEngine ( engineParameters , resolver , engineParameters . TargetJob , engineParameters . IdleSingleAction , engineParameters . MainSingleAction ) ;
46
47
47
48
var iterationTime = resolver . Resolve ( engineParameters . TargetJob , RunMode . IterationTimeCharacteristic ) ;
48
- if ( ShouldExecuteOncePerIteration ( Jit ( singleActionEngine ) , iterationTime ) )
49
+ if ( ShouldExecuteOncePerIteration ( Jit ( singleActionEngine , unrollFactor : 1 ) , iterationTime ) )
49
50
{
50
51
var reconfiguredJob = engineParameters . TargetJob . WithInvocationCount ( 1 ) . WithUnrollFactor ( 1 ) ; // todo: consider if we should set the warmup count to 1!
51
52
@@ -56,7 +57,7 @@ public IEngine CreateReadyToRun(EngineParameters engineParameters)
56
57
// it's either a job with explicit configuration or not-very time consuming benchmark, just create the engine, Jit and return
57
58
var multiActionEngine = CreateEngine ( engineParameters , resolver , engineParameters . TargetJob , engineParameters . IdleMultiAction , engineParameters . MainMultiAction ) ;
58
59
59
- DeadCodeEliminationHelper . KeepAliveWithoutBoxing ( Jit ( multiActionEngine ) ) ;
60
+ DeadCodeEliminationHelper . KeepAliveWithoutBoxing ( Jit ( multiActionEngine , unrollFactor ) ) ;
60
61
61
62
return multiActionEngine ;
62
63
}
@@ -67,11 +68,11 @@ public IEngine CreateReadyToRun(EngineParameters engineParameters)
67
68
private static bool ShouldExecuteOncePerIteration ( Measurement jit , TimeInterval iterationTime )
68
69
=> TimeInterval . FromNanoseconds ( jit . GetAverageNanoseconds ( ) ) > iterationTime ;
69
70
70
- private static Measurement Jit ( Engine engine )
71
+ private static Measurement Jit ( Engine engine , int unrollFactor )
71
72
{
72
- DeadCodeEliminationHelper . KeepAliveWithoutBoxing ( engine . RunIteration ( new IterationData ( IterationMode . IdleJit , index : - 1 , invokeCount : 1 , unrollFactor : 1 ) ) ) ; // don't forget to JIT idle
73
+ DeadCodeEliminationHelper . KeepAliveWithoutBoxing ( engine . RunIteration ( new IterationData ( IterationMode . IdleJit , index : - 1 , invokeCount : unrollFactor , unrollFactor : unrollFactor ) ) ) ; // don't forget to JIT idle
73
74
74
- return engine . RunIteration ( new IterationData ( IterationMode . Jit , index : - 1 , invokeCount : 1 , unrollFactor : 1 ) ) ;
75
+ return engine . RunIteration ( new IterationData ( IterationMode . Jit , index : - 1 , invokeCount : unrollFactor , unrollFactor : unrollFactor ) ) ;
75
76
}
76
77
77
78
private static Engine CreateEngine ( EngineParameters engineParameters , IResolver resolver , Job job , Action < long > idle , Action < long > main )
0 commit comments