风萧萧兮易水寒

Java性能测试大比拼

实体类转换哪个快?Map循环遍历哪个快?转换为字符串哪个快?测试,分析,看源码,看底层知识。

dao和vo实体转换比拼

参与比拼的两个选手:

  1. org.springframework.beans.BeanUtils
  2. 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遍历几种方式比拼

参与比拼的四个选手:

  1. keySetfor循环方式
  2. keySetiterator迭代器方式
  3. entrySetfor循环方式
  4. entrySetiterator迭代器方式

测试方式:

public static void main(String[] args) {
        Map<String, String> 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<String, String> 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<String, String> map){
        long startTime = System.currentTimeMillis();
        Iterator<String> 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<String, String> map){
        long startTime = System.currentTimeMillis();
        for (Map.Entry<String, String> 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<String, String> map){
        long startTime = System.currentTimeMillis();
        Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, String> entry = iterator.next();
            String key = entry.getKey();
            String value = entry.getValue();
        };
        long endTime = System.currentTimeMillis();
        System.out.println("entrySetIterator运行时间" + (endTime - startTime));
    };

比拼结果:

结果2

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

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

参与比拼的三个选手:

  1. 基本数据类型.toString()
  2. String.valueOf(数据)
  3. 数据+””

测试方法:

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");
    };

比拼结果:

结果3

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

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

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

3.t + ""底层使用了StringBuilder实现,先用append方法拼接,再用toString()方法获取字符串
坚持原创技术分享,您的支持将鼓励我继续创作!