Java中if else分支顺序是否影响性能?高频条件前置是否更优
if else分支顺序是否会对性能产生影响?
有开发者提出疑问:将最可能命中的条件放在if else分支最前,是否能获得更高的执行效率?
两种典型写法对比如下:
- 高概率命中条件放在if分支:
if (condition == more likely condition) {} else /** condition == rare condition **/ {}
- 低概率命中条件放在if分支:
if (condition == rare condition) {} else /** condition == more likely condition **/ {}
该开发者最初猜测:无论代码中分支编写顺序如何,JIT编译器都应该能完成对应分支优化,但始终没有查询到相关官方文档说明,因此自行编写JMH基准测试代码开展验证。
测试的验证逻辑很明确:如果分支顺序确实存在性能影响,那么bias=0.9(即if (zeroOrOne == 1)分支命中概率为0.9)场景下的吞吐量,应当显著高于bias=0.1(即else分支命中概率为0.9)的场景。
基准测试代码
public class BranchBench { @Param({ "0.02", "0.1", "0.9", "0.98", }) private double bias; @Param("10000") private int count; private final List<Byte> randomZeroOnes = new ArrayList<>(count); @Setup public void setup() { Random r = new Random(12345); for (int c = 0; c < count; c++) { byte zeroOrOne = (byte) (c < (bias * count) ? 1 : 0); randomZeroOnes.add(zeroOrOne); } Collections.shuffle(randomZeroOnes, r); } @Benchmark public int static_ID_ifElse() { int i = 0; for (final Byte zeroOrOne : randomZeroOnes) { if (zeroOrOne == 1) { i++; } else { i--; } } return i; } }
测试结果
Benchmark (bias) (count) Mode Cnt Score Error Units BranchBench.static_ID_ifElse 0.02 10000 thrpt 15 137.409 ± 1.376 ops/ms BranchBench.static_ID_ifElse 0.1 10000 thrpt 15 129.277 ± 1.552 ops/ms BranchBench.static_ID_ifElse 0.9 10000 thrpt 15 125.640 ± 5.858 ops/ms BranchBench.static_ID_ifElse 0.98 10000 thrpt 15 137.427 ± 2.396 ops/ms
初步结论
从测试数据来看,没有强有力的证据表明if else的编写顺序会对性能产生可观测的影响:高概率分支在if块、高概率分支在else块的两组对照场景中,吞吐量没有出现符合“顺序影响性能”假设的显著差距,符合最初“JIT会自动完成分支优化”的猜测。日常开发中不需要为了微乎其微的性能收益刻意调整if else分支顺序,优先保证代码可读性即可。
内容的提问来源于stack exchange,提问作者waynewing
相关产品推荐
相关产品推荐

