笔者在《for循环实战性能优化》中提出了五种提升for循环性能的优化策略,这次我们在其中嵌套循环优化小循环驱动大循环的基础上,借助Map集合高效的查询性能来优化嵌套for循环。
      如果小循环和大循环的集合元素数量分别为M和N,则双层For循环的循环次数是M*N,随着M和N的增长,对性能的影响越来越大。因此,本文考虑进一步优化,使得循环次数变为M+N。利用下面的代码来模拟测试两种情况的性能:
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors; public class ForUpdate { public static void main(String[] args) { // for (int i = 0; i < 10000; i += 10) {
// loopGivenNum(i);
// }
for (int i = 10000; i < 100000; i += 10000) {
loopGivenNum(i);
}
System.out.println("----- done -----"); } private static void loopGivenNum(int i) {
List<String> smallLoop = getLoopList(i);
List<String> bigLoop = getLoopList(2 * i);
long doByForTimes = doByFor(bigLoop, smallLoop);
long doByMapTimes = doByMap(bigLoop, smallLoop);
System.out.println("size " + i + ": " + doByForTimes + "," + doByMapTimes);
} /**
* 获取循环变量
* @param size 循环变量元素个数
*/
private static List<String> getLoopList(int size) {
List<String> list = new ArrayList<>();
for (int i = 0; i < size; i++) {
list.add(String.valueOf(i));
}
return list;
} private static long doByFor(List<String> bigLoop, List<String> smallLoop) {
long startTime = System.currentTimeMillis();
for (String str1 : smallLoop) {
for (String str2 : bigLoop) {
if (str1.equals(str2)) {
continue;
}
}
}
return System.currentTimeMillis() - startTime;
} /**
* 使用 Map 优化
* @param bigLoop
* @param smallLoop
*/
private static long doByMap(List<String> bigLoop, List<String> smallLoop) {
long startTime = System.currentTimeMillis();
// 转换成map
Map<String, String> loopMap = bigLoop.stream().collect(Collectors.toMap(k -> k, Function.identity()));
System.out.println(loopMap.size());
for (String str1 : smallLoop) {
if (loopMap.containsKey(str1)) {
continue;
}
}
return System.currentTimeMillis() - startTime;
}
}

输出结果:

size 10000: 756,97
size 20000: 3091,8
size 30000: 4342,7
size 40000: 8848,7
size 50000: 16317,7
size 60000: 31652,7
size 70000: 37078,7
     由此可见,数据量越大嵌套For循环执行时间越长,而使用Map后,纵使数据量增长到了20w,执行时间也维持在7ms左右。数据量小的时候,执行结果就不再贴出来了。
     结论:使用Map优化后的方法执行的效率比嵌套循环提高了很多很多。

for循环实战性能优化之使用Map集合优化的更多相关文章

  1. for循环实战性能优化

    完成同样的功能,用不同的代码来实现,性能上可能会有比较大的差别,所以对于一些性能敏感的模块来说,对代码进行一定的优化还是很有必要的.今天就来说一下java代码优化的事情,今天主要聊一下对于for(wh ...

  2. Map集合重要练习

    重要练习:将字符串中的字母按如下格式显示: a(1)b(2)...... 代码及思路如下: /* 获取字符串中字母的次数,并打印出如下格式a(1)b(2)c(3)...... 思路: 先定义一个方法, ...

  3. 递归、嵌套for循环、map集合方式实现树形结构菜单列表查询

    有时候, 我们需要用到菜单列表,但是怎么样去实现一个菜单列表的编写呢,这是一重要的问题. 比如我们需要编写一个树形结构的菜单,那么我们可以使用JQuery的zTree插件:http://www.tre ...

  4. 《Java程序性能优化》学习笔记 程序优化

    这一部分主要介绍代码层的优化.了解如何编写高效而精炼的代码,正确的使用函数方法.1.字符串优化处理Java语言中,String对象可以认为是对char数组的眼神和进一步封装.它主要由3部分组成:cha ...

  5. SQL索引一步到位(此文章为“数据库性能优化二:数据库表优化”附属文章之一)

    SQL索引一步到位(此文章为“数据库性能优化二:数据库表优化”附属文章之一) SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭 ...

  6. 性能优化系列三:JVM优化

    一.几个基本概念 GCRoots对象都有哪些 所有正在运行的线程的栈上的引用变量.所有的全局变量.所有ClassLoader... 1.System Class.2.JNI Local3.JNI Gl ...

  7. mysql性能优化-慢查询分析、优化索引和配置 (慢查询日志,explain,profile)

    mysql性能优化-慢查询分析.优化索引和配置 (慢查询日志,explain,profile) 一.优化概述 二.查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 ...

  8. cpu_relax( )-----对自选循环等待(spin-wait loops)操作的优化【转】

    cpu_relax()-----对自选循环等待(spin-wait loops)操作的优化 转自:http://www.doc100.net/bugs/t/173547/index.html 在loc ...

  9. JVM性能优化系列-(5) 早期编译优化

    5. 早期编译优化 早起编译优化主要指编译期进行的优化. java的编译期可能指的以下三种: 前端编译器:将.java文件变成.class文件,例如Sun的Javac.Eclipse JDT中的增量式 ...

随机推荐

  1. Sql Server 使用游标辅助循环

    项目临时表#TMPxmdt 存有ID,起始年度,完成年度(int型)两个字段: 实现功能:将#TMPxmdt表中每个ID对应的起始年度至完成年度中所有年度以(ID, ND)的形式插入另一个临时表#TM ...

  2. 11.15java实习生面试总结

    坐了两个小时的车,到了面试地点面了十五分钟左右就结束了,心里有一点难受,不过这也是刚开始,后面的路还长着呢,所以先把面试官问的题目记录下来. 1.C语言能否跨平台? 虽然我面的是java实习生,但是因 ...

  3. idea全局护眼色绿豆沙

    1.settings->plugins->BackgroundImage 2.在导航栏选择Help->FindAction 3.set background image 4.选择图片 ...

  4. php操作表格(写)

    一,转载:http://www.thinkphp.cn/extend/832.html 二,转载:http://m.blog.csdn.net/article/details?id=7827038

  5. JavaScript_01-script

    编译和解释 var a = 0; console.log(a); var b = "abc"; 编译: 一次性把代码转换成 CPU 可以看懂的语言,一行一行执行: 解释:一行一行解 ...

  6. JavaScript之变量提升

    变量提升:在JavaScript中,页面加载时,会将用var声明的变量提升到作用域的最前端,只能提升声明,不能提升赋值 如果变量先赋值再使用,可以省略关键字var 如果先使用变量,再赋值,不可以省略关 ...

  7. python多进程并行代码

    from multiprocessing import Process import sys, os import time def timetask(string): while True: pri ...

  8. [JAVASCRIPT][EXTJS]直接用JSON创建树形控件(Ext.tree.TreePanel )(转)

    直接用JSON创建树形控件(Ext.tree.TreePanel ) 1.创建多个根节点的树形 2.直接使用JsonList创建树形 <!DOCTYPE HTML PUBLIC "-/ ...

  9. datatables 自定义排序

    参考:https://datatables.net/examples/plug-ins/sorting_manual $.fn.dataTable.ext.type.order['salary-gra ...

  10. docker及lvs负载

    1.分别使用lxc容器和docker容器搭建nginx服务,能够正常访问到容器内的web服务 下载docker-ceyum仓库至 /etc/yum.repos.d/目录中,使用yum安装docker- ...