Sample: IntroSetupCleanupIteration
A method which is marked by the [IterationSetup]
attribute will be executed exactly once before each benchmark invocation, forcing UnrollFactor=1
and InvocationCount=1
(we have changed that in 0.11.0).
It's not recommended to use this attribute in microbenchmarks because it can spoil the results.
However, if you are writing a macrobenchmark (e.g. a benchmark which takes at least 100ms) and
you want to prepare some data before each invocation,
[IterationSetup]
can be useful.
A method which is marked by the [IterationCleanup]
attribute will be executed exactly once after each invocation.
This attribute has the same set of constraint with [IterationSetup]
: it's not recommended to use
[IterationCleanup]
in microbenchmarks.
Source code
using System;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Engines;
namespace BenchmarkDotNet.Samples
{
[SimpleJob(RunStrategy.Monitoring, launchCount: 1,
warmupCount: 2, iterationCount: 3)]
public class IntroSetupCleanupIteration
{
private int setupCounter;
private int cleanupCounter;
[IterationSetup]
public void IterationSetup()
=> Console.WriteLine($"// IterationSetup ({++setupCounter})");
[IterationCleanup]
public void IterationCleanup()
=> Console.WriteLine($"// IterationCleanup ({++cleanupCounter})");
[GlobalSetup]
public void GlobalSetup()
=> Console.WriteLine("// " + "GlobalSetup");
[GlobalCleanup]
public void GlobalCleanup()
=> Console.WriteLine("// " + "GlobalCleanup");
[Benchmark]
public void Benchmark()
=> Console.WriteLine("// " + "Benchmark");
}
}
The order of method calls
// GlobalSetup
// IterationSetup (1) // IterationSetup Jitting
// IterationCleanup (1) // IterationCleanup Jitting
// IterationSetup (2) // MainWarmup1
// Benchmark // MainWarmup1
// IterationCleanup (2) // MainWarmup1
// IterationSetup (3) // MainWarmup2
// Benchmark // MainWarmup2
// IterationCleanup (3) // MainWarmup2
// IterationSetup (4) // MainTarget1
// Benchmark // MainTarget1
// IterationCleanup (4) // MainTarget1
// IterationSetup (5) // MainTarget2
// Benchmark // MainTarget2
// IterationCleanup (5) // MainTarget2
// IterationSetup (6) // MainTarget3
// Benchmark // MainTarget3
// IterationCleanup (6) // MainTarget3
// GlobalCleanup
Links
- Setup And Cleanup
- The permanent link to this sample: BenchmarkDotNet.Samples.IntroSetupCleanupIteration