对 @Group @GroupThreads 的介绍

    _/*
    在之前的测试中, 每个Benchmark都是同样的一套代码, 然后所有线程都去执行一样的代码
    —-
    现在我们有个新的需求, 就是两套不同的代码, 要在一个Benchmark中一起执行
    然后再看执行效率

    */

    /*
    比如下面这个例子:_

    复制官方的代码到本地

    我们猜猜看看在多线程竞争状态下, AtomicInteger 的执行效率如何
    —-
    3个线程执行自增的代码, 1个线程执行获取数据的代码
    一共4个线程, 他们在Benchmark中一起执行, 可以模拟 AtomicInteger在多线程竞争的情况下执行效率
    */

    1. Benchmark Mode Cnt Score Error Units
    2. Sample_15_Asymmetric.benchmark_get_no_competition thrpt 651.724 ops/us
    3. Sample_15_Asymmetric.benchmark_inc_no_competition thrpt 160.327 ops/us
    4. Sample_15_Asymmetric.benchmark_thread_competition thrpt 104.397 ops/us
    5. Sample_15_Asymmetric.benchmark_thread_competition:get thrpt 56.061 ops/us
    6. Sample_15_Asymmetric.benchmark_thread_competition:inc thrpt 48.337 ops/us
    1. private AtomicInteger counter;
    2. @Setup
    3. public void up() {
    4. counter = new AtomicInteger();
    5. }
    6. @Benchmark
    7. @Group("benchmark_thread_competition")
    8. @GroupThreads(3)
    9. public int inc() {
    10. return counter.incrementAndGet();
    11. }
    12. @Benchmark
    13. @Group("benchmark_thread_competition")
    14. @GroupThreads(1)
    15. public int get() {
    16. return counter.get();
    17. }
    1. @Benchmark
    2. @Group("benchmark_inc_no_competition")
    3. @GroupThreads(1)
    4. public int inc3() {
    5. // 3个线程只执行自增操作, 应该跟上面差不多
    6. // 因为即使只有自增操作, 但由3个线程, 所有操作还是会在竞争状态
    7. return counter.incrementAndGet();
    8. }
    1. @Benchmark
    2. @Group("benchmark_get_no_competition")
    3. public int get1() {
    4. // 这个benchmark只有一个线程在执行get操作
    5. // 效率直接拉满
    6. return counter.get();
    7. }