资讯 小学 初中 高中 语言 会计职称 学历提升 法考 计算机考试 医护考试 建工考试 教育百科
栏目分类:
子分类:
返回
空麓网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
空麓网 > 计算机考试 > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: 计算机考试归档 最新发布

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会持续占用内存。

转载请注明:文章转载自 http://www.konglu.com/
本文地址:http://www.konglu.com/it/859358.html
免责声明:

我们致力于保护作者版权,注重分享,被刊用文章【JAVA程序性能优化 - 循环内集合处理优化2】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理,本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们,情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!

我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2023 成都空麓科技有限公司

ICP备案号:蜀ICP备2023000828号-2