@Setup(Level.Invocation)

Sergey Kuksenko sergey.kuksenko at oracle.com
Wed Jul 9 14:10:45 UTC 2014


Had you read Level.Invocation docs?
I'll juct copy it here:

/**
  * Invocation level: to be executed for each benchmark method execution.
  *
  * WARNING: HERE BE DRAGONS!
  * MAKE SURE YOU UNDERSTAND THE REASONING AND THE IMPLICATIONS
  * OF THE WARNINGS BELOW BEFORE EVEN CONSIDERING USING THIS LEVEL.
  *
  * It is almost never a good idea to use this in nano- and 
micro-benchmarks.
  *
  * <p>WARNING #1: In order to subtract the helper time from the
  * benchmark itself, we will have to have at least two timestamps
  * per *each* benchmark invocation. If the benchmarked method is
  * small, then we saturate the system with timestamp requests, which
  * *both* make timestamp requests the critical part of the benchmark
  * time, and inhibit workload scalability, introducing the artificial
  * scalability bottleneck.</p>
  *
  * <p>Also, the hiccups in measurement can be hidden from these individual
  * timing measurement, which can introduce inconsistent results. The 
largest
  * caveat is measuring oversaturated system where the descheduling events
  * will be missed, and the benchmark will perceive the fictionally large
  * throughput.</p>
  *
  * <p>WARNING #2: In order to maintain the basic interference behavior
  * of other Levels (e.g. the State(Scope.Benchmark) should only fire the
  * helper method once per invocation, regardless of the thread count),
  * we have to arbitrate the access to the state between worker thread,
  * and do that on *critical path*, thus further offsetting the 
measurement.</p>
  *
  * <p>WARNING #3: Current implementation in JMH allows the helper method
  * execution to overlap with the benchmark method itself in order to 
simplify
  * arbitrage. (To be redefined in future).</p>
  */
Invocation,

On 07/09/2014 06:05 PM, Ivan Gerasimov wrote:
> Hello!
>
> I noticed a great influence of presence of @Setup(Level.Invocation) on
> some benchmark results.
>
> This simple test gives the following numbers.
>
> @State(Scope.Thread)
> public class MyBenchmark {
>
> //    @Setup(Level.Invocation)
> //    public void setup() {}
>
>      @Benchmark
>      public int testMethod() {
>          return 42;
>      }
> }
>
> Benchmark                      Mode   Samples        Score  Score
> error    Units
> o.s.MyBenchmark.testMethod    thrpt         5 521204947.564
> 200284466.443    ops/s
>
>
> When I uncomment the setup() function, the numbers drops to:
>
> Benchmark                      Mode   Samples        Score  Score
> error    Units
> o.s.MyBenchmark.testMethod    thrpt         5   120471.248 32030.457 ops/s
>
>
> Am I correct that it's not practical to use @Setup(Level.Invocation)
> with measuring anything that lasts less than a microsecond or something?
>
> Sincerely yours,
> Ivan
>

-- 
Best regards,
Sergey Kuksenko


More information about the jmh-dev mailing list