巧用Map缓存提升"翻译"速度
在业务编码中,很多情况都需要用到code2Name或者id2Name之间的“翻译”,在我的过往经历中发现不少开发人员都是直接双重循环实现这种“翻译”。如果一次“翻译”的数据量较多,性能就遇上瓶颈了,这时可以考虑使用Map缓存的方式提升速度。
示例
用户表(userId, levelNum)
级别表 (levelNum, levelName)
现在要将用户列表中每个用户的levelNum翻译成levelName展示。
代码如下:
package test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TranslateTest {
public static void main(String[] args) {
//初始化列表数据
int num = 10000;
List<User> userList = new ArrayList<User>();
List<Level> levelList = new ArrayList<Level>();
for(int i=0; i<num; i++) {
userList.add(new User(i, i));
levelList.add(new Level(i, "等级:" + i));
}
//使用双重循环翻译
long startTime = System.currentTimeMillis();
translateLoop(userList, levelList);
System.out.println("translateLoop use: " + (System.currentTimeMillis() - startTime) + " MS");
clearTranslateResult(userList);
//使用map缓存翻译
startTime = System.currentTimeMillis();
translateUseMap(userList, levelList);
System.out.println("translateUseMap use: " + (System.currentTimeMillis() - startTime) + " MS");
}
//清除翻译结果
static void clearTranslateResult(List<User> userList) {
for(User user : userList) {
user.setLevelName(null);
}
}
static void translateLoop (List<User> userList, List<Level> levelList){
for(User user : userList) {
for(Level level : levelList) {
if(user.getLevelNum() == level.getLevelNum()) {
user.setLevelName(level.getLevelName());
break;
}
}
}
}
static void translateUseMap(List<User> userList, List<Level> levelList) {
Map<Integer, String> levelNum2Name = new HashMap<Integer, String>();
for(Level level : levelList) {
levelNum2Name.put(level.getLevelNum(), level.getLevelName());
}
for(User user : userList) {
user.setLevelName(levelNum2Name.get(user.getLevelNum()));
}
}
static class Level {
//级数
private int levelNum;
//级别名称
private String levelName;
public Level(int levelNum, String levelName) {
this.levelNum = levelNum;
this.levelName = levelName;
}
public int getLevelNum() {
return levelNum;
}
public void setLevelNum(int levelNum) {
this.levelNum = levelNum;
}
public String getLevelName() {
return levelName;
}
public void setLevelName(String levelName) {
this.levelName = levelName;
}
}
static class User {
private int userId;//用户ID
private int levelNum;//级数
public User(int userId, int levelNum) {
this.userId = userId;
this.levelNum = levelNum;
}
//翻译后的值
private String levelName;
public String getLevelName() {
return levelName;
}
public void setLevelName(String levelName) {
this.levelName = levelName;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public int getLevelNum() {
return levelNum;
}
public void setLevelNum(int levelNum) {
this.levelNum = levelNum;
}
}
}
结果
translateLoop use: 311 MS
translateUseMap use: 9 MS
将num加大到100000后测试结果:
translateLoop use: 75964 MS
translateUseMap use: 58 MS
总结
translateLoop使用了双重循环,时间复杂度是 O(nn)
translateUseMap,由于map的get方法通常情况下(hash不碰撞)时间复杂度是 O(1),则总时间复杂度为 O(n + 1n)
我认为:程序员,即使只是实现业务代码,还是要有空间换时间,时间换空间的意识;即使平时用不上算法,还是要对常用的算法和时间复杂度有所了解。
巧用Map缓存提升"翻译"速度的更多相关文章
- Nginx网络架构实战学习笔记(三):nginx gzip压缩提升网站速度、expires缓存提升网站负载、反向代理实现nginx+apache动静分离、nginx实现负载均衡
文章目录 nginx gzip压缩提升网站速度 expires缓存提升网站负载 反向代理实现nginx+apache动静分离 nginx实现负载均衡 nginx gzip压缩提升网站速度 网页内容的压 ...
- JavaScript的工作原理:解析、抽象语法树(AST)+ 提升编译速度5个技巧
这是专门探索 JavaScript 及其所构建的组件的系列文章的第 14 篇. 如果你错过了前面的章节,可以在这里找到它们: JavaScript 是如何工作的:引擎,运行时和调用堆栈的概述! Jav ...
- 13 nginx gzip压缩提升网站速度
一:nginx gzip压缩提升网站速度 我们观察news.163.com的头信息 请求: Accept-Encoding:gzip,deflate,sdch 响应: Content-Encoding ...
- nginx之gzip压缩提升网站速度
目录: 为啥使用gzip压缩 nginx使用gzip gzip的常用配置参数 nginx配置gzip 注意 为啥使用gzip压缩 开启nginx的gzip压缩,网页中的js,css等静态资源的大小会大 ...
- Java动态编译优化——提升编译速度(N倍)
一.前言 最近一直在研究Java8 的动态编译, 并且也被ZipFileIndex$Entry 内存泄漏所困扰,在无意中,看到一个第三方插件的动态编译.并且编译速度是原来的2-3倍.原本打算直接用这个 ...
- [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能
[.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能 本节导读: 上节说了缓存是以空间来换取时间的技术,介绍了客户端缓存和两种常用服务器缓布,本节主要介绍一种. ...
- Docker实用技巧之更改软件包源提升构建速度
一.开篇 地球,中国,成都市,某小区的阳台上,一青年负手而立,闭目沉思,阵阵的凉风吹得他衣衫呼呼的飘.忽然,他抬起头,刹那间,睁开了双眼,好似一到精光射向星空,只见这夜空......一颗星星都没有.他 ...
- 14 nginx 中配置 expires缓存提升网站负载
一:nginx 中配置 expires缓存提升网站负载 对于网站的图片,尤其是新闻站, 图片一旦发布, 改动的可能是非常小的.我们希望 能否在用户访问一次后, 图片缓存在用户的浏览器端,且时间比较长的 ...
- COCOS2DX 3.0 优化提升渲染速度 Auto-batching
COCOS2DX 3.0 优化提升渲染速度 Auto-batching 近期在看COCOS2DX 3.0的Auto-batching合批与Auto Culling动态缩减功能以下就来细致看看吧:整合好 ...
随机推荐
- 启动eclipse导致Tomcat的配置文件重置
转: 启动eclipse导致Tomcat的配置文件重置 导入一个项目,需要在Tomcat的配置文件中配置JNDI数据源,需要修改Tomcat下的server.xml文件.但是当我们修改完后重启Tomc ...
- window server2012R2激活
slmgr /ipk D2N9P-3P6X9-2R39C-7RTCD-MDVJXslmgr /skms kms.03k.orgslmgr /ato
- JAVA 程序员代码生成利器
http://www.grails.org/ 为什么要用Grails 采用groovy 开发,基于springboot+ hibernate ,groovy 语言层面运行效率稍微差点,但开发效率比j ...
- Unity3D热更新之LuaFramework篇[10]--总结篇
背景 19年年初的时候,进到一家新单位,公司正准备将现有的游戏做成支持热更的版本.于是寻找热更方案的任务就落在了我头上. 经过搜索了解,能做Unity热更的方案是有好几种,但是要么不够成熟,要么不支持 ...
- Linux 操作系统常用命令
常用命令详解 ls 常用选项: -a:列出所有文件,包括以.为开头的隐藏文件. -d ; 列出目录本身,并不包含目录里的内容. -h:和-l一起使用,文件大小容易阅读.文件的实际大小 ls -d/ro ...
- 【VS开发】uafxcwd.lib(afxmem.obj) : error LNK2005: 已经在 LIBCMTD.lib(new.obj) 中定义错误解决方案
如果在编译MFC程序的时候出现下列及类似的错误: 1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator ...
- PHP学习(9)——错误和异常处理
1.Exception类 这个类是PHP为异常处理提供的内置类.构造函数的两个参数分别是错误消息和错误代码. 除了构造函数之外,该类还提供了如下的内置方法: · getCode() 返回传递给构造函数 ...
- mac编译openJDK8
买了<深入理解Java虚拟机> 周志明著这本书一直没有看,我们的程序都用JVM在跑,所以学习java必须掌握JVM,才能理解我们对象到底干嘛了. 1.为什么要编译JDK 想要一探JDK ...
- React生命周期使用
组件的生命周期可分成三个状态: Mounting:已插入真实 DOM Updating:正在被重新渲染 Unmounting:已移出真实 DOM 生命周期的方法有: componentWillMoun ...
- poj3162(树形dp+线段树求最大最小值)
题目链接:https://vjudge.net/problem/POJ-3162 题意:给一棵树,求每个结点的树上最远距离,记为a[i],然后求最大区间[l,r]满足区间内的max(a[i])-min ...