栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JAVA程序性能优化 - 循环内集合处理优化2

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JAVA程序性能优化 - 循环内集合处理优化2

接上述文章,这里继续探讨下循环内集合使用怎么优化

先看下原代码:

public static void outsideLoop() {
        List list = new ArrayList<>();
        int i = 0;
        while (++i < 10000000){
          Map map = new HashMap<>();
          map.put("key0","values");
          map.put("key1","values");
          map.put("key2","values");
          map.put("key3","values");
          list.add(map);
        }
        System.out.println("end of execution : "+list.size());
    }

上述代码,很容易的就能看出来问题,循环体内初始化,在资源优先的情况下,必然会内存溢出,并且初始化过程本省也是会消耗性能的。我们先看下执行结果(我这里堆内存设置的为300m):

不出意外的OOM了。

优化思路:提取循环内的初始化,再使用完map之后清理map数据。

对于清理map数据得方式有很多种,一个是根据key值remove,第二个直接clear。那我们再来看下打这两者效率对比。

(1)使用remove 清理map数据

public static void outsideLoop() {
        List list = new ArrayList<>();
        int i = 0;
        Map map = new HashMap<>();
        while (++i < 5000000){
          map.put("key0","values");
          map.put("key1","values");
          map.put("key2","values");
          map.put("key3","values");
          list.add(map);
          map.remove("key0");
          map.remove("key1");
          map.remove("key2");
          map.remove("key3");
        }
        System.out.println("end of execution : "+list.size());
    }

结果:可以看出来已经解决了OOM问题了  ---执行时间:~350ms

 (2) 使用clear清理map

 public static void outsideLoop() {
        List list = new ArrayList<>();
        int i = 0;
        Map map = new HashMap<>();
        while (++i < 5000000){
          map.put("key0","values");
          map.put("key1","values");
          map.put("key2","values");
          map.put("key3","values");
          list.add(map);
          map.clear();
        }
        System.out.println("end of execution : "+list.size());
    }

 结果:可以看到相同数据量的情况下,clear效率会比remove更好一点的 -- 执行时间:~300ms。

分析过程:

remove源码:可以容易看出来,remove是通过先找到key的节点然后进行删除操作,如果再key比较复杂的情况下,该方式就很耗性能了。

 clear源码:这个就是直接根据列表长度将列表进行删除了,不关心树节点的操作。

 综合对比:

方式100万500万1000万100万key-60
原方式1077msOOMOOM10000ms
使用remove清理map77ms340ms596ms923ms

使用clear清理map

61ms306ms518ms600ms

结论:

      1、提出循环体内初始化,可以明显的提交性能。

      2、再map的key数量较少时,clear和remove方式性能相差不大,但clear等优。

      3、数据量很大或者不知时,都推荐使用clear。

      4、如果循环后续有其他相关业务时,再完成list集合或者对象使用之后,手动清除list=null,  因为list的生命周期随方法的结束,如果后续逻辑复杂,list会持续占用内存。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/859358.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号