CPU分支预测对Java程序的影响

通过Java基准测试工具(JMH)对比不同列表排序方式下分支预测的性能表现,发现分支预测的效果受输入数据分布的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

回忆课上教的, 和几篇博文

https://blog.youkuaiyun.com/rrrfff/article/details/44993467?ticket=ST-106021-6fOewnguwhi3rUrgYAUb-passport.youkuaiyun.com


都提到了分支预测正确时可以给程序带来一定的性能提升, 为此利用JMH写了个简单的测试例子, 但并没有得到想要的结论:

@BenchmarkMode(Mode.Throughput)
@Warmup(iterations = 2)
@Measurement(iterations = 5)
@State(Scope.Benchmark)
@Fork(1)
public class BranchPredicateTest {
  private final int n = 100_0000;
  private List<Integer> list1;
  private List<Integer> list2;
  private List<Integer> list3;
  private int mid;

  @Setup
  public void setup() {
    Random random = new Random();
    list1 = new ArrayList<>(n);
    for (int i = 0; i < n; ++i) {
      int x = random.nextInt();
      list1.add(x);
    }
    // Collections.shuffle(list1);

    list2 = new ArrayList<>(list1);
    list2.sort(Integer::compare);
    mid = list2.get(n - 1);

    list3 = new ArrayList<>(list1);
    list3.sort((a, b) -> Integer.compare(b, a));
  }

  @Benchmark
  public void test_1(Blackhole b) {
    int mid = this.mid;
    List<Integer> list = this.list1;
    int count = 0;
    for (int i = 0; i < n; ++i) {
      Integer x = list.get(i);
      if (x < mid) {
        ++count;
      }
    }
    b.consume(count);
  }

  @Benchmark
  public void test_2(Blackhole b) {
    int mid = this.mid;
    List<Integer> list = this.list2;
    int count = 0;
    for (int i = 0; i < n; ++i) {
      Integer x = list.get(i);
      if (x < mid) {
        ++count;
      }
    }
    b.consume(count);
  }

  @Benchmark
  public void test_3(Blackhole b) {
    int mid = this.mid;
    List<Integer> list = this.list3;
    int count = 0;
    for (int i = 0; i < n; ++i) {
      Integer x = list.get(i);
      if (x < mid) {
        ++count;
      }
    }
    b.consume(count);
  }

}

结果是

Benchmark                    Mode  Cnt    Score     Error  Units
BranchPredicateTest.test_1  thrpt    5  768.592 ± 160.822  ops/s
BranchPredicateTest.test_2  thrpt    5  110.549 ±   7.976  ops/s
BranchPredicateTest.test_3  thrpt    5  111.322 ±  16.005  ops/s


恢复被注释掉的那行之后却得到了不同的结论:

Benchmark                    Mode  Cnt    Score    Error  Units
BranchPredicateTest.test_1  thrpt    5  111.782 ± 11.104  ops/s
BranchPredicateTest.test_2  thrpt    5  115.126 ± 10.607  ops/s
BranchPredicateTest.test_3  thrpt    5  113.624 ± 20.216  ops/s



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值