2019年6月

向量化优化

JVM的向量化优化是借助CPU的SIMD指令 即通过单条指令控制多组数据的运算。被称为CPU指令级别的并行。

  1. HotSpot虚拟机运用向量化优化的方法有两种,第一种是HotSpot intrinsic调用特定方法的时候替换为使用SIMD指令的高效实现。
  2. 依赖即时编译器进行自动向量化,在循环展开优化之后将不同迭代的运算合并为向量运算。

注解处理器

注解处理器有三个用途:

1. 定义编译规则,并检查被编译的源文件
2. 修改已有源码
3. 生成新的源码。

Java源代码的编译过程可分为三个步骤,分别为解析源文件生成抽象语法树,调用已注册的注解处理器,和生成字节码,如果在第2步中,注解处理器生成了新的源代码,那么Java编译器将重复第1、2步,直至不再生成源代码。

逃逸分析就是分析新建的对象是否会泄露到外面去 如果没有泄露到外面去的话则可以进行锁消除等优化减少损耗。
逃逸分析的依据有两点:

  1. 对象是否在堆中(堆对所有可见)
  2. 看对想是否作为方法调用的调用者 或者 参数( 可逃逸 )

即时编译器会优化实例字段以及静态字段访问,以及减少总的内存访问数目
沿着控制流进行字段缓存,并在接下来的字段读取缓存时操作直接使用该缓存的值。

在一些可以利用CPU的特定指令进行优化的方法可以对其增加注解
@HotSpotIntrinsicCandidate注解
对于标上这些注解的方法会被虚拟机替换成高效的指令序列。
比较知名的就是JAVA的CAS(CompareAndSet)在x86_64中会被替换成lock cmpxchg指令

https://www.lintcode.com/problem/minimum-depth-of-binary-tree/description
关键点:后序收集节点高度 取最低的(如果为0需要特判。)

/**
 * Definition of TreeNode:
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left, right;
 *     public TreeNode(int val) {
 *         this.val = val;
 *         this.left = this.right = null;
 *     }
 * }
 */

public class Solution {
    /**
     * @param root: The root of binary tree
     * @return: An integer
     */
    private int res = Integer.MAX_VALUE;
    private int solve(TreeNode node){
        if(node == null){
            return 0;
        }
        int left = solve(node.left);
        int right = solve(node.right);
        if(left == 0 && right == 0){
            return 1;
        }else if(left == 0){
            return right + 1;
        }else if(right == 0){
            return left + 1;
        }else{
            return Math.min(left, right) + 1;
        }
    }
    public int minDepth(TreeNode root) {
        if(root == null){
            return 0;
        }
        return solve(root);
    }
}