JMH中如何为每次调用初始化数据?

How to initialize the data for each invocation in JMH?

我正在尝试创建修改集合的基准。 问题是我不知道如何为每次调用初始化数据。

假设Test.DATA是一个包含200个元素的集合。
test 方法根据 a.isTrue() 的值删除数据。
我知道 @Setup 类似于 JUnit 的 @Setup。我想使用 @Before 但我在 JMH 找不到。 每次调用test方法前如何初始化数据?
非常感谢您。

@State(Scope.Thread)
public class JavaCollectionBenchmark {

    List<Foo> cols;

    @Setup
    public void prepare(){
        cols= new ArrayList<>(Test.DATA);
    }

    @Benchmark
    public long test(){
        if(cols.size() != 200) {
            System.out.println("SECOND TIME DOESN'T WORK!");
            System.exit(0);
        }else{
            System.out.println("FIRST TIME");
        }
        cols.removeIf(a-> a.isTrue());
        return cols.size();
    }
}

检查 @Setup 注释上的 Level 参数。 @Before 等价于

@Setup(Level.Invocation)

其中有解释,以及许多警告(WARNING: HERE BE DRAGONS! THIS IS A SHARP TOOL. 等)here