I have a class that constructs some complicated data (imagine a large XML or JSON structure - that sort of thing). Constructing it takes time. So I want to construct it once
I would just move all of your benchmark methods into one class, define your state object as an inner class, and inject the state to each of them:
public class ParserBenchmarks {
@State(Scope.Thread)
public static class StateHolder {
Parser parser = null;
@Setup(Level.Iteration)
public void setup()
{
parser = new Parser(TestSet.PARSE_ME);
}
public Parser getParser() {
return parser;
}
}
@Benchmark
public int getId_123(StateHolder stateHolder) {
return stateHolder.getParser().getId(123);
}
@Benchmark
public int getId_456(StateHolder stateHolder) {
return stateHolder.getParser().getId(456);
}
}
Note that all of your benchmark methods should return values otherwise the compiler could eliminate it as dead code.