常见的for循环优化方式
?> 前言
经常使用一些循环,进行耗时计算的操作,特别是 for 循环,它是一种重复计算的操作,如果处理不好,耗时就比较大,如果处理书写得当,将大大提高效率,下面总结几条 for 循环的常见优化方式。
首先初始化一个集合 list,如下:
List<String> list = new ArrayList<>();
方式一:最常规的不加思考的写法
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
- 优点:较常见,易于理解
- 缺点:每次都要计算
list.size()
方式二:数组长度提取出来
int size = list.size();
for (int i = 0; i < size; i++) {
System.out.println(list.get(i));
}
- 优点:不必每次都计算
list.size() - 缺点:
- size 的作用域不够小,违反了最小作用域原则
- 不能在 for 循环中操作 list 的大小,比如除去或新加一个元素
方法三:数组长度提取出来
for (int i = 0, size = list.size(); i < size; i++) {
System.out.println(list.get(i));
}
- 优点:不必每次都计算,变量的作用域遵循最小范围原则
- 缺点:
- size 的作用域不够小,违反了最小作用域原则
- 不能在 for 循环中操作 list 的大小,比如除去或新加一个元素
方法四:采用倒序的写法
for (int i = list.size() - 1; i >= 0; i--) {
System.out.println(list.get(i));
}
- 优点:不必每次都计算,变量的作用域遵循最小范围原则
- 缺点:
- 1、结果的顺序会反
- 2、看起来不习惯,不易读懂
- 适用场合:与显示结果顺序无关的地方:比如保存之前数据的校验
方法五:Iterator 遍历
for (Iterator<String> it = list.iterator(); it.hasNext(); ) {
System.out.println(it.next());
}
- 优点:简洁
方法六:jdk 1.5 后的写法
for (String o : list) {
System.out.println(o);
}
- 优点:简洁, 结合泛型使用更简洁
- 缺点:jdk 1.4 向下不兼容(也就是 < 1.5 版本就不能这么写)
方法七:循环嵌套外小内大原则
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10000; j++) {
}
}
原因
?> 分支优化规则
引入流水线工作机制以后,为了配合流水线工作,处理器增加了一个分支目标缓冲器(Branch Target Buffer)。在流水线工作模式下,如果遇到分支结构,就可以利用分支目标缓冲器预测并读取指令的目标地址。分支目标缓冲器在程序运行时将动态记录和调整转移指令的目标地址,可以记录多个地址,对其进行表格化管理。当发生转移时,如果分支目标缓冲器中有记录,下一条指令在取指令阶段就会将其作为目标地址。如果记录地址等于实际目标地址,则并行成功;如果记录地址不等于实际目标地址,则流水线被冲洗。同一个分支,多次预测失败,则更新记录的目标地址。因此,分支预测属于 “经验主义” 或 “机会主义",会存在一定的误测。
基于上述原因,大家以后在编写多重循环时应该把大循环放到内层,这样可以增加分支预测的准确度,如下面的示例所示:
int[][] a = new int[10][10000];
for (int i = 0; i < 10; i++) {
// 下面每次循环会预测成功9999次
// 第1次没有预测,最后退出循环时预测失败1次这样的
// 过程重复10次
for (int j = 0; j < 10000; j++) {
a[i][j]++;
}
}
for (int j = 0; j < 10000; j++) {
// 下面每次循环会预测成功9次
// 第1次没有预测,最后退出循环时预测失败1次
// 这样的过程重复10000次
for (int i = 0; i < 10; i++) {
a[i][j]++;
}
}
方法八:循环嵌套提取不需要循环的逻辑
// 前:
int a = 10, b = 11;
for (int i = 0; i < 10; i++) {
i = i * a * b;
}
// 后:
int c = a * b;
for (int i = 0; i < 10; i++) {
i = i * c;
}
方法九:异常处理写在循环外面
反例:
for (int i = 0; i < 10; i++) {
try {
} catch (Exception e) {
}
}
正例:
try {
for (int i = 0; i < 10; i++) {
}
} catch (Exception e) {
}
常见的for循环优化方式的更多相关文章
- 高性能MySql进化论(十一):常见查询语句的优化
总结一下常见查询语句的优化方式 1 COUNT 1. COUNT的作用 · COUNT(table.filed)统计的该字段非空值的记录行数 · ...
- ListView常见的优化方式简述
ListView的优化 对于ListView来说,应该算是布局中几种最常用的组件之一了,使用也十分方便,下面个大家介绍一下两种常见的优化方式. 1.条目复用优化 其实listview的工作原理就是,l ...
- 常见 Web 性能优化方式
这篇文章是我阅读 Web Performance 101 之后的进行的粗糙的翻译作为笔记,英语还行的童鞋可以直接看原文. 这篇文章主要介绍了现代 web 加载性能(注意不涉及代码算法等),学习为什么加 ...
- 常见SQL编写和优化
常见的SQL优化方式 对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by 涉及的列上建立索引. 应尽量避免在 where 子句中对字段进行null 值判断,否则将导致引擎放弃 ...
- ArrayList和LinkedList的几种循环遍历方式及性能对比分析
最新最准确内容建议直接访问原文:ArrayList和LinkedList的几种循环遍历方式及性能对比分析 主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性 ...
- Oracle 优化方式
Oracle的优化器有两种优化方式,即基于规则的优化方式(rule-based optimization 简称RBO)和基于代价的优化方式(cost-based optimization 简称CBO) ...
- 90%的开发者都不知道的UI本质原理和优化方式
前言 很多开发者在工作中一直和UI打交道,所以认为UI非常的简单! 事实上对于90%的开发者来说,不知道UI的本质原理. 虽然在开发中,我们在接到产品的UI需求之后,可以走捷径照抄大型APP代码,但是 ...
- 技术分享 | 在MySQL对于批量更新操作的一种优化方式
欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 作者:景云丽.卢浩.宋源栋 GreatSQL社区原创内容未经授权不得随意使用,转 ...
- dp优化 | 各种dp优化方式例题精选
前言 本文选题都较为基础,仅用于展示优化方式,如果是要找题单而不是看基础概念,请忽略本文. 本文包含一些常见的dp优化("√"表示下文会进行展示,没"√"表示暂 ...
- ArrayList和LinkedList的几种循环遍历方式及性能对比分析(转)
主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayList和LinkedList的源码实现分析性能结果,总结结论. 通过本文你可以 ...
随机推荐
- 【奥运会】yahoo的这个骚操作令人费解。。。
昨天在朋友圈发了一张截图,貌似很多朋友没有 get 到点,我也实在搞不懂 Yahoo 的这波操作. 默认排序是按照金牌总数,那必然是美国第一名了.不过习惯上不应该是按照金牌总数进行排名吗?毕竟金银铜牌 ...
- HHKB 键盘布局记录以及一些闲言碎语
HHKB (happy hacking keyboard) 是世界顶级键盘品牌,自 1996 年推出以来畅销至今.与其他键盘不同,HHKB 机身小巧,省略了 F1 - F12 功能键.光标键和 Pag ...
- 技术文档 | OpenSCA技术原理之composer依赖解析
OpenSCA知识小课堂开课了! 今天主要介绍基于composer包管理器的组件成分解析原理. composer介绍 composer是PHP的依赖管理工具. 开发者受到Node.js的npm及Rub ...
- 移动端h5中rem适配
1 (function (win, lib) { 2 var doc = win.document; 3 var docEl = doc.documentElement; 4 var metaEl = ...
- 定期发送邮件功能-outlook与腾讯邮箱
一.背景:定期发送邮件功能挺好用的,可以帮忙我们在特殊的时间点发送邮件,以及实现无人推送的功能 二.outlook的实现1.首先编辑好邮件保存至草稿 2.选项-延迟传递,设置不早于传递的时间,点击发送 ...
- Could not get a resource from the pool 异常定位和解决
最近在服务中经常看到以下错误,进行下定位和问题解决分析: 2023-12-08 00:10:58.248 WARN [terra-sr-server,a9006fd27ccb81d0,a9006fd2 ...
- 搞了个Blazor工具站,域名一次性买了10年!
大家好,我是沙漠尽头的狼. 在 Dotnet9 上线在线小工具和小游戏后,服务器的压力感觉挺大的,打开25个页面,内存占用170MB左右,CPU保持在60~70%,看来Server真不适合搞这类交互较 ...
- Keep English Level-04
firm -- 坚定的,坚固的;公司 share -- n 股份,份额 executive -- 执行官 There is no chance,no density,no fate,that can ...
- [转帖]Java 提速之 Large pages【译】
https://juejin.cn/post/7011002046899978253 一.前言 最近花了很多时间在 JVM 的内存预留代码上.它开始是因为我们得到了外部贡献,以支持在 Linux 上使 ...
- [转帖]Oracle 性能优化 之 游标及 SQL
https://www.cnblogs.com/augus007/articles/9273236.html 一.游标 我们要先说一下游标这个概念. 从 Oracle 数据库管理员的角度上说,游标是对 ...