性能提高:循环中使用map匹配,而不是使用内层循环

Cartographer前端之多分辨率map匹配 任务动机:提高Cartographer前端匹配建图方法的鲁棒性。 任务描述:针对Cartographer前端匹配中Ceres优化时初始值不准确的情形,构造多分辨率map,使当前帧点云分别和多分辨率map匹配,计算得到准确的位姿变换矩阵,进而提升建图的鲁棒性。 1. Cartographer前端 Cartographer前端:当前帧点云和栅格地图通过使用扫描匹配(scan_match)方法进行位姿估计。扫描匹配就是想办法把当前帧点云和栅格地图对齐,对齐过程中的旋转和平移就是它们的相对位姿... 阅读详情

1. 测试代码

package xyz.yq56;


import java.awt.event.ItemEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import javax.naming.InitialContext;

public class MapOpt {
	
	public MapOpt() {
		
	}
	
	public MapOpt(int num1,int num2) {
		init(num1,num2);
	}
	
	private static List<Person>  list1;;
	private static List<Face> list2;
	
	public void init(int num1,int num2) {
		list1=new ArrayList<>();
		list2=new ArrayList<>();
		for(int i =0;i<num1;i++) {
			Person person=new Person();
			person.setId(i);
			person.setName("name_"+i);
			list1.add(person);
		}
		
		for(int i =0;i<num2;i++) {
			Person person=new Person();
			person.setId(i);
			person.setName("name_"+i);
			
			Face face=new Face();
			face.setId(i);
			face.setPersonId((int)Math.random()*100);
			
			list1.add(person);
			list2.add(face);
		}
	}
	
	 class Person{
		private int id;
		
		private String name;

		public int getId() {
			return id;
		}

		public void setId(int id) {
			this.id = id;
		}

		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}
		
	}
	

	
	
	public void test1(){
		long t1=System.currentTimeMillis();
		for(int i=0;i<list1.size();i++) {
			for(int j=0;j<list2.size();j++) {
				if(list1.get(i).getId()==list2.get(j).getPersonId()) {
					list2.get(j).setName(list1.get(i).getName());
				}
			}
		}
		System.out.println("双重循环耗时:"+(System.currentTimeMillis()-t1)+" ms");
	}
	public void test2() {
		long t2=System.currentTimeMillis();
		Map<Integer, String> personMap=list1.stream().collect(Collectors.toMap(Person::getId, Person::getName,(k,v)->v));
		System.out.print("stream耗时:"+(System.currentTimeMillis()-t2)+" ms => ");
		for(int i=0;i<list2.size();i++) {
			list2.get(i).setName(personMap.get(list2.get(i).getPersonId()));
		}
		System.out.println("循环map耗时:"+(System.currentTimeMillis()-t2)+" ms");
	}
	
	private void test(int num1,int num2) {
		MapOpt mapOpt=new MapOpt(num1,num2);
		System.out.println("外层对象数量 "+num1+" ;内层对象数量: "+num2);
		System.out.println("");
		for(int i=0;i<2;i++) {
			mapOpt.test1();
			mapOpt.test2();
			System.out.println();
		}
	}
	public static void main(String[] args) {
			MapOpt mapOpt=new MapOpt();
			mapOpt.test(200, 20000);
			System.out.println("****************************************");
			mapOpt.test(20000, 200);
	}
	
	
	 class Face{
		private int id;
		
		private String name;
		
		private int personId;

		public int getId() {
			return id;
		}

		public void setId(int id) {
			this.id = id;
		}
		
		public int getPersonId() {
			return personId;
		}

		public void setPersonId(int personId) {
			this.personId = personId;
		}

		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}
		
	}
}

2. 测试结果

测试结果表明,map匹配效率更高
在这里插入图片描述

3.3 测试结论

如果出现两个list的值匹配,尽可能将其中一个转化为map结构。

Java for循环嵌套for循环,你需要懂的代码性能优化技巧 Java for循环嵌套for循环 性能优化 阅读详情

相关推荐

map遍历的四种方式及性能比较

自己整理的map遍历的方式及性能分析,欢迎批评指正哈哈

java_map放在循环外和循环里面的区别

参考致谢:https://blog.youkuaiyun.com/weixin_30376083/article/details/97595629 创建对象的过程实际上和c语言定义指针的引用及其相似,都是指向一块内存地址,所以放在循环外面始终只有一块内存地址,而放在循环里面则会生成多个内存地址 ...

zs_life的博客 786

免安装版Notepad++终极配置:右键菜单+图标美化+多文件批量处理(2024新版)

本文详细介绍了如何为免安装版Notepad++进行终极配置,包括右键菜单添加、图标美化以及多文件批量处理功能。通过注册表编辑和高级定制,用户可以在便携版中实现与安装版相同的功能体验,同时保持系统整洁。特别适合开发者、系统管理员和效率追求者使用。

nut55的博客 830

HashMap的几种循环方式性能比较

实验条件: 分别用keySet,values, entrySet, Iterator 循环含有100000次的Map对象,将value存到一个变量里,比较用时大小 为保证Map中的key并不是完全规律的,所以key的取值做以下处理 1、利用keySet进行遍历 2、利用values进行遍历 3、利用entrySet进行遍历 4、利用Iterator进行遍历 结果: 结论: 由结果可以看出,第二种和第四种循环Map效率更高,虽然用迭代器看上去写的代码复杂些。 ...

weixin_40626699的博客 1174

H3C模拟器HCL防火墙路由模式主备配置实验

摘要:本文详细介绍了网络拓扑规划与设备配置方案。运营商仅提供一个接口地址,通过虚IP技术实现双防火墙高可用部署:主备防火墙分别配置10.20.10.1/29和10.20.10.2/29作为实际上联地址,共享10.10.10.2/24虚IP;下联配置172.168.10.0/24网段,核心交换机配置VLAN接口及192.168.10.1、192.168.20.1两个下联接口。文章包含运营商路由器、防火墙(HA配置、VVRP设置)和核心交换机的具体命令行配置步骤,并强调需进行主备切换验证。整个方案实现了单运营商

LQ的博客 1124

ROS学习【11】-----基于ubuntu16.04上Gazebo机器人环境搭建的传感器仿真(camera、kinect、Lidar),并通过Rviz进行数据显示

ROS学习-----基于ubuntu16.04上Gazebo机器人环境搭建的传感器仿真目录一、Gazebo环境搭建前的准备1、将搭建模型下载到我们的gazebo环境下2、升级我们的gazebo版本二、创建配置launch文件参数的world文件1、进入工程包mbot_gazebo2、创建文件夹worlds3、进入该文件夹4、创建playground.world文件5、创建room.world文件三...

qq_42451251的博客 3611

DRV8818搭配MK64FX512实现双极步进电机驱动:从选型到调试

步进电机是工业自动化与小型机器人中使用最广的执行机构之一,双极步进电机因力矩密度高、定位准确而成为主流。其驱动核心在于通过H桥控制绕组电流,并借助固定关断时间PWM斩波实现电流调节;不同衰减模式的选择则直接影响低速平稳性与高速响应。工程实践中若仅依赖MCU直接搭桥,电流采样、过流保护和死区控制都需自行解决,而采用MCU+专用驱动芯片的架构将规划与功率执行分离,显著提升可靠性。此类方案广泛应用于工业设备、桌面数控与小型机器人平台。DRV8818PWPR配合MK64FX512VDC12正是这一思路的代表,涵盖选

weixin_33895475的博客 514

kivy--入门(一)(Windows)python

从零开始学习kivy 由于课程需要写一个app,还要写报告,这就很愁人,头秃,脑壳大。 虽然学过Android,但是小编对于Java就像对牛弹琴似的,不能说完全不懂,只能说Java这个语言不太适合我,不学还不行,还是先利用python的kivy编写一个吧。 在各大网站搜索开发app,发现适合写手机app的除了Android还有kivy,所以还是先学习如何使用吧! 文章目录从零开始学习kivy前言一、安装二、添加按钮+标签三、文本输入(TextInput)总结 前言 首先推荐这篇博客kivy的安装和使用

刘念卿的博客 9970

Map 遍历的四种方法和性能测试

今天在中软机试的过程中用到了Map,但当想到如何使用map时候大脑一片空白,现在把list map 内容的方法做个归纳总结。 一、 利用Map. keyset方法。 在map中方法定义如下:  Set keySet(); 例如: for (String stuKey : stuMap.keySet()) { stuStr = stuKey; stu = stuMa

夜深人静后的码农 4160

Navicat Premium 12 永久激活保姆级教程(附最新补丁下载)

本文详细介绍了Navicat Premium 12的高效使用方法,从安装配置到高级功能应用,帮助用户充分发挥这款数据库管理工具的全部潜力。内容包括数据库连接管理、数据查询与编辑、数据同步与结构对比等核心功能,以及性能优化和最佳实践建议,提升数据库管理效率。

weixin_28834765的博客 646

AI辅助游戏开发实战:Kimi K3提升Unity开发效率与代码质量

在游戏开发领域,有限状态机(FSM)是构建角色AI行为逻辑的核心设计模式,它通过定义明确的状态和转换条件,使游戏实体能够智能地响应环境变化。其原理在于将复杂的行为分解为离散的状态节点,并通过事件驱动状态切换,从而实现清晰、可维护的AI架构。这项技术的价值在于显著提升了游戏角色的行为真实感和开发效率,被广泛应用于NPC行为控制、角色动画管理、UI流程等场景。随着AI编程助手的兴起,开发者现在可以借助如Kimi K3这类工具,通过自然语言指令快速生成和优化FSM等复杂系统的代码框架,将更多精力投入到核心玩法与性

weixin_30430677的博客 411

Unity 贴图自动匹配材质工具 贴图自动添加到材质球工具 材质球匹配贴图工具 Substance Painter制作的贴图自动匹配材质球工具

有的同学可能会问:模型制作好,在模型设置里先解压贴图,再解压材质不就行了? 当然可以,不过现在解决的是模型没有贴图,贴图都是在SP里做的,导出来都是单独的贴图,不会直接和模型绑定 总之,你自己一个一个往材质球上贴也没啥问题,我是觉得贴的太痛苦了,来一个模型我得拿来贴贴贴…贴个der. 编辑器扩展就能解决很多手动的问题.贴图名称必须是:模型名称_材质球名称_贴图类型文件 - 导出贴图 - 配置里需要这样命名 属性这里可以修改默认后缀 这里设置名称规则:objName + “_” + mat.name + m_

CTangZe的博客 5370

[工作流节点10] 获取多条数据并循环执行 —— 明道云批处理自动化实战

本文系统介绍了明道云工作流中"获取多条数据+循环执行"的批处理功能。该功能通过筛选数据集合并逐条处理,适用于批量通知、数据更新等场景。文章详细解析了功能配置方法,包括数据筛选、循环设置和异常处理,并提供了合同到期提醒等典型应用案例。同时强调了数据量控制、分批处理、错误处理等优化策略,帮助用户实现高效批量自动化。这一功能组合能将业务从单条处理升级为批量驱动,显著提升工作效率。

每日出拳老爷子的博客 457

如何高效的匹配、筛选数据,避免嵌套循环

从以上可以看出,我们将b数组数据转换为map只需遍历遍历一次b数组,而后匹配过程基于has函数,几乎无循环遍历过程,相比于在a数组遍历里面遍历b数组效率要高得多,因为嵌套方式是a数组有多少元素就要遍历多少次b数组,数据量少时体现不出什么,当数据量很大时就会有极大的性能差异,所以开发过程中如果遇到这种需求可以考虑下本文提供的方法。

六哥是全栈博客 765

Horn-Schunck光流算法的Python实现

光流是计算机视觉领域中的一个重要概念,它描述了图像中物体在时间上的运动。Horn-Schunck光流算法是一种经典的光流估计方法,通过对图像的亮度变化进行建模,来估计像素的运动速度。在本文中,我们将使用Python实现Horn-Schunck光流算法,并提供相应的源代码。请注意,该算法假设图像上的亮度变化主要由物体的运动引起,并且假设光流在整个图像上是稠密的。在上面的示例中,我们首先读取了两个输入图像,然后使用我们实现的Horn-Schunck光流算法估计了它们之间的光流。首先,我们需要导入一些必要的库。

持续更新 495

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java中如何将嵌套循环性能提高500倍

java中如何将嵌套循环性能提高500倍 前面 似乎上一次更新在遥远的九月份,按照既定的时间线应该要补5篇博文才对得起这懒惰的半年:expressionless:, 近期工作强度虽不大,但也时有烦心的事儿,比如这忽冷忽热的天气、反反复复的疫情、不大不小的房贷、还有我那半死不活的手机,当然咯,手机这月必须得换了,准备xperia 5 Ⅲ或者iPhone SE ,资金若是充裕的话也给老爸换一部(耳机也安排上),各位觉得如何呢;哈哈:smile:,扯远了,现在就来填一下坑(补一篇博客)。 首先,我面对的

HongYu012的博客 2012

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java中List和Map的特性对两组大批量数据进行匹配

本文章来给各位同学介绍Java中List和Map的特性对两组大批量数据进行匹配 ,有需要了解的同学不防进入参考参考。   在项目中遇到一个问题:要将通过http方式发送过来的大批量数据(这个数据保守估计每次请求在10万条左右),要和数据库中的另一批数据(数据库中的记录1万条左右)进行匹配(匹配:指两组数据中的某几个字段值相等),匹配上的数据保存在数据库中,匹配不上的直接扔掉。或者说:有一个Li

lowkie17的专栏 3204

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

两个List循环效率对比 List转Map 循环效率对比 Listmap 循环 效率对比

一、情景描述1、在微服务开发中,如: 查询用户列表 userList,需要关联查询 每个用户下面的文件信息,由于数据库层隔离,不能直接进行 left join ,则需要通过关联查询 文件服务,来获取每个用户下的文件信息,伪代码如下:List userList = userService.getList(xx); List userFileList = fileService.getList(userIdList);2、再通过 关联的id,进行匹配; 一般进行匹配的方式有2种,

HaHa_Sir的博客 4294

使用Map对于两层for循环的一个优化

使用Map的get方法来对某些情形下的f多重or循环进行优化。 没有优化前代码List> result = new ArrayList<>(); List> result1 = new ArrayList<>(); List> result2 = new ArrayList<>(); result1 = CITService.queryComplianIndexLastDay(); result

付梦伟的博客 7910

C++中map与unordered_map全面对比:原理、性能与使用场景

C++中map与unordered_map全面对比:原理、性能与使用场景

嗨,欢迎来到我的 优快云 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 1924

【Java】性能优化——使用Map实现多列表数据合并

Java使用Map实现多列表数据高性能合并

啊松同学的博客 1104

两个for循环 与 for循环+map 匹配效率对比

转载:http://www.5180it.com:8080/bbs/admin/1/104.html 在项目中,我们经常会使用到for循环去匹配对应的数量,例如在成绩表里,我们只保存了学生的id,我们需要根据学生id去匹配对应的学生信息, 这里我就不谈为什么不join关联表去查询(毕竟数量多了,关联查询也是很慢的,我本地就6万的学生信息,10多万的成绩,关联查询就100多秒了。。。) 我们看下面的例子 发现虽然加了break跳出第二层循环,但还是要耗时19秒,这就有点难...

ls2008 1968

java map大量数据库_Java中List和Map的特性对两组大批量数据进行匹配

在项目中遇到一个问题:要将通过http方式发送过来的大批量数据(这个数据保守估计每次请求在10万条左右),要和数据库中的另一批数据(数据库中的记录1万条左右)进行匹配(匹配:指两组数据中的某几个字段值相等),匹配上的数据保存在数据库中,匹配不上的直接扔掉。或者说:有一个List strList,List personList,strNoList.size是1万,personList.size是10...

weixin_39618730的博客 788

优化嵌套循环:从低效到高效的数据匹配技巧

对于每个User,你获取userId,然后逐一顺序搜索UserMemo列表,检查userId是否匹配。现在对比一个更聪明的方法:我们将UserMemo列表预处理成一个Map<Long, String>,其中每个键是userId,值是对应的内容。在这个例子中,我们遍历了50,000个用户,并且为每个用户扫描了30,000条备忘录,总共产生了15亿次迭代。在本文中,我们将探讨一个常见的性能瓶颈以及如何优化它。在这种情况下,一旦我们在内层循环中找到匹配的userMemo后,后面什么也没做。这段代码有什么问题吗?

郑龙飞 834

使用graphhopper(map-matching)进行地图匹配

使用graphhopper(map-matching)进行地图匹配

lei1321231236574的博客 4885
上一篇: Kafka安裝以及基本使用,新手友好
下一篇: 分享一个比较好用的图片url转base64工具类
一步一结
博客等级 码龄7年 50粉丝 65原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值