zoukankan      html  css  js  c++  java
  • 关于集合并集优化

      线上环境遇到跨库 事物的问题,历史数据 状态不一致问题。由于分布式事物还不成熟,决定使用手动写自动任务每天定时执行。大概思路是查询库1的数据,然后查询库2的数据,之后去差集后再更新数据2的数据。

          写完后,求差集 。刚开始使用了集合的removeAll ,测试环境数据量几千条没什么问题,但是考虑到线上有30多万条数据,于是写了个测试。发现使用removeAll超级慢。经过跟踪源码发现,removeAll里面使用了两次contains函数,相当是使用了笛卡尔积的方式 30万*30万。 于是决定优化。

         方式如下:

    long startTime = System.currentTimeMillis();
            LinkedList<String> result = new LinkedList<>();
    
    
            for (int i =0;i<300000;i++){
                result.add(i+"");
            }
    
            System.out.println("result size:" + result.size());
    
            List<String> list1 = new ArrayList<>();
            for (int j = 10;j<301000;j++){
                list1.add(j+"");
            }
    
            System.out.println("list1 size:" + list1.size());
    
            System.out.println("插入时间:" + (System.currentTimeMillis()-startTime));
    
            HashSet<String> hashSet = new HashSet<>(list1);
            Iterator<String> it = result.iterator();
    
            while (it.hasNext()){
                if (hashSet.contains(it.next())){
                    it.remove();
                }
            }
    
    
            System.out.println(result.size());
            for (String str : result){
                System.out.println("str:" + str);
            }
            long endTime = System.currentTimeMillis();
            long time = endTime-startTime;
            System.out.println("持续时间:" + time/1000 + "秒");

     这样基本是ms级的

  • 相关阅读:
    k8s之创建etcd集群
    完美解决微信video视频隐藏控件和内联播放问题
    JS工具库封装:Video转换成Canvas
    H5 video 标签 播放事件
    iSlider 如丝般高性能H5全屏滑动组件
    设计模式之 适配器模式
    c++ STL常用算法使用方法
    快速排序与二分查找
    CLOSE_WAIT TIME_WAIT
    erlang erl文件编译的三种脚本
  • 原文地址:https://www.cnblogs.com/thinkingandworkinghard/p/9475879.html
Copyright © 2011-2022 走看看