笔者在《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. C# vb .net实现gamma伽玛调整特效滤镜

    在.net中,如何简单快捷地实现Photoshop滤镜组中的gamma伽玛调整特效滤镜呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: ...

  2. ADO.NET 二(Connection)

    C# 语言中 Connection 类是 ADO.NET 组件连接数据库时第一个要使用的类,也是通过编程访问数据库的第一步. 接下来了解一下 Connection 类中的常用属性和方法,以及如何连接 ...

  3. cxx11emu.h 和 logprint.h

    cxx11emu.h 和 logprint.h /* Start of cxx11emu.h */ #ifndef STDBP_CXX11EMU_H_ #define STDBP_CXX11EMU_H ...

  4. springboot+security整合(1)

    说明 springboot 版本 2.0.3源码地址:点击跳转 系列 springboot+security 整合(1) springboot+security 整合(2) springboot+se ...

  5. springboot学习入门简易版六---springboot2.0整合全局捕获异常及log4j日志(12-13)

    使用Aop实现 1创建异常请求 在原有项目基础上,jspController中创建一个可能发生异常的请求: /** * 全局捕获异常测试 * @param i * @return */ @Reques ...

  6. jenkens 安装是git版本过低 升级

    Jenkins本机默认使用"yum install -y git" 安装的git版本比较低,应该自行安装更高版本的git. 查看jenkins本机的git版本 1 2 [root@ ...

  7. sqlserver 将一个表中的某些字段更新到另一个表中(转载)

    来源:https://blog.csdn.net/qq_23888451/article/details/86615555 https://blog.csdn.net/cyxinda/article/ ...

  8. php基本数据类型

    trim()函数,用于去除字符串首尾空格和特殊字符返回的是去掉的空格和特殊字符后的字符串 string trim(string str [,string charlist]); str 要操作的字符串 ...

  9. Linux命令——readlink、realpath

    参考:Linux命令——ln Linux readlink and realpath Command Tutorial for Beginners (with Examples) 简介 ln命令允许你 ...

  10. my.cnf参数说明

    MySQL 5.7数据库参数优化 连接相关参数 max_connections:允许客户端并发连接的最大数量,默认值是151,一般将该参数设置为500-2000 max_connect_errors: ...