在业务编码中,很多情况都需要用到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 + 1
n)

我认为:程序员,即使只是实现业务代码,还是要有空间换时间,时间换空间的意识;即使平时用不上算法,还是要对常用的算法和时间复杂度有所了解。

巧用Map缓存提升"翻译"速度的更多相关文章

  1. Nginx网络架构实战学习笔记(三):nginx gzip压缩提升网站速度、expires缓存提升网站负载、反向代理实现nginx+apache动静分离、nginx实现负载均衡

    文章目录 nginx gzip压缩提升网站速度 expires缓存提升网站负载 反向代理实现nginx+apache动静分离 nginx实现负载均衡 nginx gzip压缩提升网站速度 网页内容的压 ...

  2. JavaScript的工作原理:解析、抽象语法树(AST)+ 提升编译速度5个技巧

    这是专门探索 JavaScript 及其所构建的组件的系列文章的第 14 篇. 如果你错过了前面的章节,可以在这里找到它们: JavaScript 是如何工作的:引擎,运行时和调用堆栈的概述! Jav ...

  3. 13 nginx gzip压缩提升网站速度

    一:nginx gzip压缩提升网站速度 我们观察news.163.com的头信息 请求: Accept-Encoding:gzip,deflate,sdch 响应: Content-Encoding ...

  4. nginx之gzip压缩提升网站速度

    目录: 为啥使用gzip压缩 nginx使用gzip gzip的常用配置参数 nginx配置gzip 注意 为啥使用gzip压缩 开启nginx的gzip压缩,网页中的js,css等静态资源的大小会大 ...

  5. Java动态编译优化——提升编译速度(N倍)

    一.前言 最近一直在研究Java8 的动态编译, 并且也被ZipFileIndex$Entry 内存泄漏所困扰,在无意中,看到一个第三方插件的动态编译.并且编译速度是原来的2-3倍.原本打算直接用这个 ...

  6. [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能

    [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能 本节导读: 上节说了缓存是以空间来换取时间的技术,介绍了客户端缓存和两种常用服务器缓布,本节主要介绍一种. ...

  7. Docker实用技巧之更改软件包源提升构建速度

    一.开篇 地球,中国,成都市,某小区的阳台上,一青年负手而立,闭目沉思,阵阵的凉风吹得他衣衫呼呼的飘.忽然,他抬起头,刹那间,睁开了双眼,好似一到精光射向星空,只见这夜空......一颗星星都没有.他 ...

  8. 14 nginx 中配置 expires缓存提升网站负载

    一:nginx 中配置 expires缓存提升网站负载 对于网站的图片,尤其是新闻站, 图片一旦发布, 改动的可能是非常小的.我们希望 能否在用户访问一次后, 图片缓存在用户的浏览器端,且时间比较长的 ...

  9. COCOS2DX 3.0 优化提升渲染速度 Auto-batching

    COCOS2DX 3.0 优化提升渲染速度 Auto-batching 近期在看COCOS2DX 3.0的Auto-batching合批与Auto Culling动态缩减功能以下就来细致看看吧:整合好 ...

随机推荐

  1. 利用phpStudy 探针 提权网站服务器

    声明: 本教程仅仅是演示管理员安全意识不强,存在弱口令情况.网站被非法入侵的演示,请勿用于恶意用途! 今天看到论坛有人发布了一个通过这phpStudy 探针 关键字搜索检索提权网址服务器,这个挺简单的 ...

  2. 008-ICMP协议(网络控制文协议)

    一.概述 ICMP是(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP协议簇的一个子协议,用于在IP主机.路由器之间传递控制消息.控制 ...

  3. 一百二十三:CMS系统之登录功能

    配置文件中加入前台用户的身份标识 form class SigninForm(BaseForm): telephone = StringField(validators=[Regexp(r'1[345 ...

  4. Python3 编程第一步_斐波纳契数列_连续赋值

    # Fibonacci series: 斐波纳契数列 # 两个元素的总和确定了下一个数 a, b = 0, 1 while b < 10: print(b) a, b = b, a+b # 1 ...

  5. C#创建windows服务(一:初识windows服务)

    一 . 服务简介 Microsoft Windows 服务(过去称为 NT 服务)允许用户创建可在其自身的 Windows 会话中长时间运行的可执行应用程序. 这些服务可在计算机启动时自动启动,可以暂 ...

  6. 哈希算法MD5和SHA1的C#实现

    /* * 哈希算法MD5和SHA1的C#实现 *  *  * 夏春涛 Email:xChuntao@163.com  * Blog:http://bluesky521.cnblogs.com * 运行 ...

  7. Golang gRPC微服务01: 介绍

    gRPC 是什么 gRPC是goole开源的一个RPC框架和库,支持多语言之间的通信.底层通信采用的是 HTTP2 协议.gRPC在设计上使用了 ProtoBuf 这种接口描述语言.这种IDL语言可以 ...

  8. v-on可以监听多个方法吗?

    原文地址 v-on可以监听多个方法 <template> <div class="about"> <button @click="mycli ...

  9. python3 速查参考- python基础 7 -> 函数编程之 装饰器、生成器

    装饰器 1.速查笔记 #-- 函数装饰器:是它后边的函数的运行时的声明 由@符号以及后边紧跟的"元函数"(metafunction)组成 @staticmethod def sme ...

  10. 自动化运维:(1)认识 Shell

    目录 (一)运维是什么? (二)什么是 Shell? (三)Shell的分类 (四)Shell脚本 (五)Shell的变量 (六)表达式 (七)Linux常见符号 (八)常见命令 (一)自动化运维是什 ...