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

java代码性能优化

刷题过程中遇到的一些时间复杂度相同,但是常数因子的差距导致的性能差距,遇到持续更新

枚举 VS contains

例如:判断一个字符是不是元音

法一:
if(ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u')
法二:
Set<Character> set = new HashSet<>();
set.add('a');
set.add('e');
set.add('i');
set.add('o');
set.add('u');if(set.contains(ch))

结果显示法一更快

        在指令并行的基础上,多个条件判断可以并行执行

法二的问题在于:

        contains()是一个动态方法调用

        涉及哈希函数计算、char-Character的装箱拆箱

        java的虚拟方法调用会带来额外的开销,方法调用会产生栈帧的压入弹出

        对CPU分支预测不友好,因为大部分都不是元音,无法有效利用CPU的预测机制

什么时候用contains?

1.要比较的内容是动态变化的

2.元素很多,手写条件判断太繁琐

3.代码可读性和可维护性优先于极致性能


【题外话】CPU预测机制:CPU在执行指令的时候是按照流水线方式工作的,希望尽可能多地并行处理多个指令,但是遇到if分支的时候,CPU不知道应该走哪一分支,所以会导致流水线停顿,《分支预测》就是CPU根据历史行为猜测程序下一步会走哪个分支,从而提前执行那部分代码,减少等待时间。也就是会根据过去的行为预测未来,预测错了就退回正确路径继续执行,预测对了就节省大量时间

【极致优化】

boolean[] isVowel = new boolean[128];
isVowel['a'] = true;
isVowel['e'] = true;
isVowel['i'] = true;
isVowel['o'] = true;
isVowel['u'] = true;// 使用时:
if (isVowel[c]) {// 是元音
}

while VS for

法一:
while(r < s.length()){...r++;
}
法二:
for(int i = 0 ; i < ss.length ; i++ )

本质上虽然是一样的,但是while循环不如for循环直观,容易造成不必要的分支判断,编译器对for的优化更好(向量化)

for更适合已知循环次数的情况,且控制变量声明、条件判断、步进操作都在一行可读性强

编译器会对for循环做一系列优化:

        向量化:如果循环体中是可并行计算的,JVM/JIT会吧这些操作向量化加速执行

        循环展开:编译器会自动将某些for循环展开为多个重复的操作,减少跳转指令的开销

for循环CPU会更容易预测,因为for循环的迭代次数往往是固定的或可预判的,分支预测器能更好的工作

什么时候用while:

循环次数不确定

依赖外部状态变化退出循环

实现队列、栈、事件驱动等结构

简单的“直到满足条件才退出”逻辑

char[] VS charAt

将字符串转成字符数据可以避免每次都调用方法,可以提高访问效率

charAt是个方法调用、每次调用都需要进行边界检查

char[]提高缓存局部性,编译器对数组访问的优化更好,但是有额外的内存消耗

什么时候用charAt()

字符串很长但是只需要访问少数几个字符,节省内存

http://www.xdnf.cn/news/737119.html

相关文章:

  • MODIS火点数据下载
  • 人工智能时代Agent与MCP区别联系
  • 001在线拍卖系统技术揭秘:构建高效交互的竞拍平台
  • JS浮点数精度问题
  • WebFuture:网站部分图片突然无法显示的原因
  • 身份证发给别人怎么加水印?赛文奥特曼身份证添加水印教程
  • 大模型应用开发第九讲:RAG(检索增强生成)流程:用户查询→检索→生成响应
  • CQF预备知识:Python相关库 -- NumPy 基础知识 - 通用函数
  • xilinx位置约束
  • SAR ADC 比较器噪声分析(二)
  • gst_pad_query_default以及gst_pad_event_default
  • 2024PLM系统实施案例:天水天轲零部件
  • Sigma-Aldrich3D细胞培养支架有哪些类型?
  • LoRA:高效微调预训练模型的利器
  • DeepSeek-R1 重磅升级,智能体验再进化!
  • shell脚本的两种循环及状态返回值的区别及对比
  • 软件架构基础
  • ollama国内安装使用
  • 时间序列数据如何转化为动态图实践笔记
  • XSS跨站脚本攻击
  • 特伦斯 S75:重塑钢琴体验的数码钢琴之选
  • 基于教育数字化背景:人工智能技术支持下的教师专业发展路径
  • Baklib智能推荐赋能内容中台升级
  • 低频 500kHz vs 高频 1MHz,FP6291C与FP6291升压芯片应用在不同场景该怎么选择?
  • Spring生命周期中织入代理逻辑
  • 大模型-attention汇总解析之-MHA
  • 电工基础【2】自锁、互锁、正反转电路
  • leetcode动态规划—完全背包系列
  • 【论文阅读】DanceGRPO: Unleashing GRPO on Visual Generation
  • ✨1.1.1 按位与运算替代求余运算优化场景