巧用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动态缩减功能以下就来细致看看吧:整合好 ...
随机推荐
- OriginPro 9.1 科研图标绘制入门
OriginPro 9.1 科研图标绘制入门 目的:1.介绍如何不用编程画出复杂多样的图表2.介绍OriginLab 常用功能3.科研报告时,有效绘图,省却时间 科研发展需求.反映专业形象.满足公司要 ...
- 纯CSS实现加载转圈样式
不同的项目中对于等待加载时转圈圈的样式是不同的,有的是传统的转圈的gif图片,见得比较多的是将转圈圈的换成了可爱的图标.有时候项目中加入等待加载的图片会很违和,不符合美观,所以需要用CSS做一个.下面 ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_6-03 高级篇幅之zuul常用问题分析
笔记 3.高级篇幅之Zuul常用问题分析和网关过滤器原理分析 简介:讲解Zuul网关原理和过滤器生命周期, 1.路由名称定义问题 路由映射重复覆盖问题 ...
- SSH客户端神器之 MobaXterm
SSH客户端神器之 MobaXterm 由于需要连接远程 Linux 服务器,早期使用过 Putty,SecureCRT,后面主要使用 Xshell. 自从接触了 MobaXterm之后,个人感觉比 ...
- 实时更新Excel文档外部数据源的数据
实时更新Excel文档外部数据源的数据 单元格区域.Excel 表.数据透视表或数据透视图均可以连接到外部数据源(数据源:用于连接数据库的一组存储的"源"信息.数据源包含数据库服务 ...
- php7与其他版本共存
转自: https://zhangge.net/5088.html php7编译安装 https://zhangge.net/5075.html
- Git(4):远程仓库
添加\连接远程库 目前我们使用到的 Git 命令都是在本地执行,如果你想通过 Git 分享你的代码或者与其他开发人员合作. 你就需要将数据放到一台其他开发人员能够连接的服务器上. 远程仓库可以是Git ...
- python-Web-数据库-oracle
1.oracle体系结构 --------全局数据库,这里指物理磁盘上的数据库(物理结构,一个真实存在的磁盘目录),一般一台oracle服务器有1个全局数据库,文件占1G多.oracle允许一台 -- ...
- pagefile.sys 虚拟内存
当我们使用电脑的时候,有时候需要更多的内存空间,但是内存条的价格又比较昂贵,我们可以用虚拟内存的方法,把一部分硬盘的空间作为内存使用. 进入控制面板---高级系统设置----高级-----更改---- ...
- Windows主机SAM文件格式破解解密
文件格式如是下图这种格式: 那么就可以通过通过kali终端samdump2 + system + sam 生成出来通过hashcat -m 1000去跑,或者通过md5查询