Java日常性能优化大比拼

一:dao和vo实体转换比拼

参与比拼的两个选手:

①org.springframework.beans.BeanUtils

②org.springframework.cglib.beans.BeanCopier

测试方式:

   public static void main(String[] args) {
        int leng = 10000000;
        Stu stu = new Stu();
        stu.setStuId("id");
        stu.setStuName("name");
        stu.setStuAge(12);
        stu.setStuClassId("ClassId");
        StuVO stuVO = new StuVO();
        long l = System.currentTimeMillis();
        for (int i = 0; i < leng; i++) {
            BeanCopier beanCopier = BeanCopier.create(stu.getClass(), stuVO.getClass(), false);
            beanCopier.copy(stu,stuVO,null);
        }
        System.out.println("beanCopier.copy:"+(System.currentTimeMillis()-l));
        l = System.currentTimeMillis();
        for (int i = 0; i < leng; i++) {
            BeanUtils.copyProperties(stu,stuVO);
        }
        System.out.println("BeanUtils.copyProperties:"+(System.currentTimeMillis()-l));
    }

比拼结果:

备注:如果把BeanCopier.create放到循环外,效率还可以加快!!!  可能由于各方面原因,次数较少时测试不准

二:Map遍历几种方式比拼

参与比拼的四个选手:

①keySet的for循环方式

②keySet的iterator迭代器方式

③entrySet的for循环方式

④entrySet的iterator迭代器方式

测试方式:

public static void main(String[] args) {
        Map map = new HashMap<>();
        for (int i = 0; i < 1; i++) {
            map.put(i + "", i + "AA");
        }
        keySet(map);
        keySetIterator(map);
        entrySet(map);
        entrySetIterator(map);
    }
    /**
     * keySet的for循环方式
     * @param map
     */
    public static void keySet(Map map){
        long startTime = System.currentTimeMillis();
        for (String key : map.keySet()) {
            String value = map.get(key);
        }
        long endTime = System.currentTimeMillis();
        System.out.println("keySet运行时间" + (endTime - startTime));
    }

    /**
     * keySet的iterator迭代器方式
     * @param map
     */
    public static void keySetIterator(Map map){
        long startTime = System.currentTimeMillis();
        Iterator iterator = map.keySet().iterator();
        while (iterator.hasNext()) {
            String key = iterator.next();
            String value = map.get(key);
        }
        long endTime = System.currentTimeMillis();
        System.out.println("keySetIterator运行时间" + (endTime - startTime));
    }

    /**
     * entrySet的for循环方式
     * @param map
     */
    public static void entrySet(Map map){
        long startTime = System.currentTimeMillis();
        for (Map.Entry entry : map.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("entrySet运行时间" + (endTime - startTime));
    }

    /**
     * entrySet的iterator迭代器方式
     * @param map
     */
    public static void entrySetIterator(Map map){
        long startTime = System.currentTimeMillis();
        Iterator> iterator = map.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry entry = iterator.next();
            String key = entry.getKey();
            String value = entry.getValue();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("entrySetIterator运行时间" + (endTime - startTime));
    }

比拼结果:

Java日常性能优化大比拼_第1张图片

备注:可能由于各方面原因,次数较少时测试不准

三:基本数据类型转为字符串方法比拼

参与比拼的三个选手:

①基本数据类型.toString()

②String.valueOf(数据)

③数据+""

测试方法:

public static void main(String[] args) {
        int end = 1000000000;
        Integer t = 1;
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < end; i++){
            String str = t.toString();
        }
        System.out.println("Integer.toString():" + (System.currentTimeMillis() - startTime) + "ms");
        startTime = System.currentTimeMillis();
        for (int i = 0; i < end; i++){
            String str = String.valueOf(t);
        }
        System.out.println("String.valueOf():" + (System.currentTimeMillis() - startTime) + "ms");
        startTime = System.currentTimeMillis();
        for (int i = 0; i < end; i++){
            String str = t + "";
        }
        System.out.println("t + '' :" + (System.currentTimeMillis() - startTime) + "ms");
    }

比拼结果:

备注:可能由于各方面原因,次数较少时测试不准

1.String.valueOf()方法底层调用了Integer.toString()方法,但是会在调用前做空判断

2.Integer.toString()方法,直接调用

3.t + ""底层使用了StringBuilder实现,先用append方法拼接,再用toString()方法获取字符串

你可能感兴趣的:(后端开发)