java – 为什么分支预测比没有分支更快?

前端之家收集整理的这篇文章主要介绍了java – 为什么分支预测比没有分支更快?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
灵感来自这个问题:
Why is it faster to process a sorted array than an unsorted array?

我写了自己的分支预测实验:

  1. public class BranchPrediction {
  2. public static void main(final String[] args) {
  3. long start;
  4. long sum = 0;
  5.  
  6. /* No branch */
  7. start = System.nanoTime();
  8. sum = 0;
  9. for (long i = 0; i < 10000000000L; ++i)
  10. sum += i;
  11. System.out.println(System.nanoTime() - start);
  12. System.out.println(sum);
  13.  
  14. /* With branch */
  15. start = System.nanoTime();
  16. sum = 0;
  17. for (long i = 0; i < 10000000000L; ++i)
  18. if (i >= 0)
  19. sum += i;
  20. System.out.println(System.nanoTime() - start);
  21. System.out.println(sum);
  22.  
  23. /* No branch (again) */
  24. start = System.nanoTime();
  25. sum = 0;
  26. for (long i = 0; i < 10000000000L; ++i)
  27. sum += i;
  28. System.out.println(System.nanoTime() - start);
  29. System.out.println(sum);
  30.  
  31. /* With branch (again) */
  32. start = System.nanoTime();
  33. sum = 0;
  34. for (long i = 0; i < 10000000000L; ++i)
  35. if (i >= 0)
  36. sum += i;
  37. System.out.println(System.nanoTime() - start);
  38. System.out.println(sum);
  39. }
  40. }

结果让我感到困惑:根据程序输出,带分支的循环比没有分支循环的循环可靠得快.

输出示例:

  1. 7949691477
  2. -5340232226128654848
  3. 6947699555
  4. -5340232226128654848
  5. 7920972795
  6. -5340232226128654848
  7. 7055459799
  8. -5340232226128654848

为什么会这样?

编辑:

>反汇编类显示Java编译器没有优化(遗漏)任何东西(https://gist.github.com/HouzuoGuo/5692424)
> Why is it faster to process a sorted array than an unsorted array?作者使用的Java基准技术与我的相同.
>该机器是Intel核心i7,运行Linux 3.2 64位和Oracle JVM 1.7 64位
>当我超过循环迭代的次数时,with-branch循环比非分支循环运行多SECONDS.

解决方法

请记住,JVM正在内部优化执行,并且PC内部有缓存可以加快计算速度.由于你拥有如此强大的处理器(许多独立核心),因此并不奇怪.另请注意,代码在Java代码下运行,该代码映射到PC的机器代码.只需输入尽可能优化的代码,让JVM担心它.

编辑:大负荷的机器和硬件,它们运行效率更高.特别是缓存.

猜你在找的Java相关文章