当前位置: 首页 > news >正文

Java随谈(七)代码优化思路之用空间换时间

前言

在计算机之中,用“空间换时间”是计算机一个常用的优化策略。
本文通过java语言和项目开发的例子,更加深入地理解这个概念

例子说明

Java语言中使用空间换时间的例子

  1. Integer类中,IntegerCache预缓存-128到127的整数对象。
  2. ThreadLocal,‌每个 Thread 内部维护一个 ThreadLocalMap,存储该线程独有的变量副本‌。常用于连接池的线程绑定、日志追踪 ID等。注:ThreadLocal的变量使用完需主动remove。
  3. 不单独创建线程,而是通过管理线程池使用线程资源。

项目开发中使用空间换时间的例子

下面我用简单的几个来进行说明。

  1. 使用额外空间减少重复计算

public class SpaceTimeExample {// 递归版本(指数级)public static long fibonacciRecursive(int n) {if (n <= 1) return n;return fibonacciRecursive(n - 1) + fibonacciRecursive(n - 2);}// 缓存版本(线性)public static long fibonacciCached(int n) {// 使用额外空间存储中间结果long[] fib = new long[n + 1];fib[0] = 0L; fib[1] = 1L;for (int i = 2; i <= n; i++) {// 避免重复计算fib[i] = fib[i - 1] + fib[i - 2];}return fib[n];}// 性能测试(n=40)public static void main(String[] args) {int n = 40;long start = System.nanoTime();long result1 = fibonacciRecursive(n);long time1 = System.nanoTime() - start;start = System.nanoTime();long result2 = fibonacciCached(n);long time2 = System.nanoTime() - start;System.out.printf("递归版本: %d ns (%.2f 秒)%n", time1, time1 / 1e9);System.out.printf("缓存版本: %d ns (%.2f 毫秒)%n", time2, time2 / 1e6);System.out.printf("性能提升: %.0f 倍%n", (double) time1 / time2);}
}

在我的电脑上(Apple M1 芯片,16G内存)
递归版本: 293748834 ns (0.29 秒)
缓存版本: 13750 ns (0.01 毫秒)
性能提升: 21364 倍
2. 用字典表减少查询次数

public enum StatusEnum {DRAFT("草稿"),PENDING("待审批"),APPROVED("审批通过"),REJECTED("审批拒绝"),WITHDRAW("主动取消"),FROZEN("已冻结"),;/*** 说明*/private final String desc;StatusEnum(String desc) {this.desc = desc;}public String getDesc() {return desc;}/*** 可以再次提交审批的状态*/public Boolean canReApprovedStatus(StatusEnum status) {if (StatusEnum.DRAFT == status || StatusEnum.REJECTED == status || StatusEnum.WITHDRAW == status) {return true;} else {return false;}}/*** 通过空间换时间的版本, 将可以再次提交审批的状态存入字典*/public static final Set<StatusEnum> CAN_RE_APPROVED_STATUS_SET =EnumSet.of(StatusEnum.DRAFT, StatusEnum.REJECTED, StatusEnum.WITHDRAW);public static Boolean betterCanReApprovedStatus(StatusEnum status) {return CAN_RE_APPROVED_STATUS_SET.contains(status);}}
  1. 预加载资源
    /*** 预编译正整数的正则*/public static final Pattern PATTERN = Pattern.compile("^\\d+$");public static Boolean match(String number) {return PATTERN.matcher(number).matches();}public static void main(String[] args) {String number = "123.45";System.out.printf("该数字:%s是否为正整数:%s%n", number, match(number));String number2 = "123";System.out.printf("该数字:%s是否为正整数:%s%n", number2, match(number2));}

适用场景

  1. 数据查询重复率高
  2. 数据占用空间有限,不会引起OOM
  3. 代码高频访问,优化后提升明显

风险

  1. 在内存稀缺的场景下(如嵌入式开发)容易引发OOM,在原始数据量巨大的情况下,可能会耗尽内存。
  2. 若源数据重复率很低,大量的数据冷启动容易引起内存等资源的浪费。
http://www.jsqmd.com/news/1382332/

相关文章:

  • 南通启益建设集团有限公司网站:见证本土工程实力的成长轨迹与服务承诺
  • FModel终极指南:解锁虚幻引擎游戏资源的完整免费工具
  • 别只盯着模型了!AI应用开发的五层技术栈全解析,从GPU到用户界面!
  • Slashscore:基于GitHub数据的开发者关系图谱分析与应用指南
  • 从Prompt到Skill-Creator:AI能力工程化实战指南
  • 阿里云Wan3.0公测指南:AI应用开发平台与VivaReel创作者节实战解析
  • MySQL 8.0降级5.7实战:压缩包安装、数据迁移与兼容性处理
  • 使用LoRA技术微调大语言模型,模仿特定写作风格实战指南
  • 成图大赛第19届国赛深度解析:从技能竞赛到工程问题解决的范式转变
  • Python自学全攻略:从环境搭建到项目实战的完整路径
  • KMS智能激活终极指南:一键搞定Windows与Office永久激活
  • 《生灵重塑》全流程攻略:多结局达成与全收集成就指南
  • Aegisub实战:手把手教你制作专业级中日双语音乐字幕
  • Stable Diffusion面部修复神器ADetailer:告别AI绘画脸崩难题
  • 线性与非线性规划:原理、算法与应用场景解析
  • Web文件上传全解析:从表单到分片上传与断点续传实战
  • 深度解析霍尔果斯建设局网站如何赋能城市基建与民生服务的全面升级
  • Ubuntu 24.04搜狗输入法安装与闪屏问题终极解决方案
  • C++数据结构实战:构建高精度任意进制转换器
  • 2026 年至今,武冈靠谱的合金精密无缝钢管订制厂家电话,你手里用的工业“隐形骨架”,凭什么让精密设备使用寿命翻三倍? - 行业推荐官[官方】--
  • 深度解析南宁市建设局网站作为获取南宁城市建设政策资讯首选平台的价值与意义
  • 猫抓工具实战:网页音视频资源嗅探与M3U8流媒体下载指南
  • 功率器件版图设计实战:基于Tanner L-Edit的轻量化EDA解决方案
  • 服务端自动化任务的可诊断设计-se2026081301 - 市场沸点
  • Node.js旅游行程规划系统开发实战
  • 数据分析师必备Python工具链与实战技巧
  • 游戏开发配置系统实战:JSON动态配置与热重载实现
  • Stable Diffusion模型全解析:从Checkpoint到LoRA的AI绘画实战指南
  • C++实现FastNewman社区发现算法:从模块度优化到工程实践
  • 告警疲劳治理:三层过滤框架与实战优化策略