?> 前言

经常使用一些循环,进行耗时计算的操作,特别是 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循环优化方式的更多相关文章

  1. 高性能MySql进化论(十一):常见查询语句的优化

    总结一下常见查询语句的优化方式 1        COUNT 1.       COUNT的作用 ·        COUNT(table.filed)统计的该字段非空值的记录行数 ·         ...

  2. ListView常见的优化方式简述

    ListView的优化 对于ListView来说,应该算是布局中几种最常用的组件之一了,使用也十分方便,下面个大家介绍一下两种常见的优化方式. 1.条目复用优化 其实listview的工作原理就是,l ...

  3. 常见 Web 性能优化方式

    这篇文章是我阅读 Web Performance 101 之后的进行的粗糙的翻译作为笔记,英语还行的童鞋可以直接看原文. 这篇文章主要介绍了现代 web 加载性能(注意不涉及代码算法等),学习为什么加 ...

  4. 常见SQL编写和优化

    常见的SQL优化方式 对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by 涉及的列上建立索引. 应尽量避免在 where 子句中对字段进行null 值判断,否则将导致引擎放弃 ...

  5. ArrayList和LinkedList的几种循环遍历方式及性能对比分析

    最新最准确内容建议直接访问原文:ArrayList和LinkedList的几种循环遍历方式及性能对比分析 主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性 ...

  6. Oracle 优化方式

    Oracle的优化器有两种优化方式,即基于规则的优化方式(rule-based optimization 简称RBO)和基于代价的优化方式(cost-based optimization 简称CBO) ...

  7. 90%的开发者都不知道的UI本质原理和优化方式

    前言 很多开发者在工作中一直和UI打交道,所以认为UI非常的简单! 事实上对于90%的开发者来说,不知道UI的本质原理. 虽然在开发中,我们在接到产品的UI需求之后,可以走捷径照抄大型APP代码,但是 ...

  8. 技术分享 | 在MySQL对于批量更新操作的一种优化方式

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 作者:景云丽.卢浩.宋源栋 GreatSQL社区原创内容未经授权不得随意使用,转 ...

  9. dp优化 | 各种dp优化方式例题精选

    前言 本文选题都较为基础,仅用于展示优化方式,如果是要找题单而不是看基础概念,请忽略本文. 本文包含一些常见的dp优化("√"表示下文会进行展示,没"√"表示暂 ...

  10. ArrayList和LinkedList的几种循环遍历方式及性能对比分析(转)

    主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayList和LinkedList的源码实现分析性能结果,总结结论. 通过本文你可以 ...

随机推荐

  1. C# CRC8

    C# CRC8 C# /// /// This enum is used to indicate what kind of checksum you will be calculating. /// ...

  2. compilation.templatesPlugin is not a function

    ERROR Failed to compile with 1 error TypeError: compilation.templatesPlugin is not a function - SetV ...

  3. 深入浅出 WebRTC AEC(声学回声消除)

    前言:近年来,音视频会议产品提升着工作协同的效率,在线教育产品突破着传统教育形式的种种限制,娱乐互动直播产品丰富着生活社交的多样性,背后都离不开音视频通信技术的优化与创新,其中音频信息内容传递的流畅性 ...

  4. Woodpecker CI 设计分析|一个 Go 编写的开源持续集成引擎

    一.前言 大家好,这里是白泽.随着 Go 语言在云原生领域大放异彩,开发者逐渐将目光转移到了这门语言上,而容器则是云原生时代最核心的载体. <Woodpecker CI 设计分析>系列文章 ...

  5. Windows 10 修改环境变量不重启生效的解决方案

    # 表示 Win 键 #R 进入 cmd(不要使用 Listary 的 cmd 方式进入,设置不会生效) 键入 set PATH=C: 关闭窗口 同样方式打开 cmd 键入 echo %PATH%,会 ...

  6. 如虎添翼!高德地图+Serverless 护航你的假日出行

    ​ 作者 | 刘金龙(福辰) 高德团队 引言 ​ "前方事故多发地段,请注意保持车距..." "您已疲劳驾驶,请注意休息..." "前方经过泰山旅游景 ...

  7. nextTick使用

  8. 引发C++异常的常见原因(一)从报错地址到错误症状

    在进行C++软件开发的过程中,会遇到很多问题,网上差不到,或者查到了也没什么信息可以用,所以这里想到了就将一些常见的问题放在一起,归纳整理一下. 本文主要的内容来源于CSDN的大佬文章:https:/ ...

  9. 线段树 hdu 4027

    ***又是超时的问题,当一个区间全是1时,再去开方和不开方是一样的,所以在这一步不需要再往底层递归了*** #include <iostream> #include <cstdio& ...

  10. java基础(3)--pulic class与class的区别

    1.一个类前面的public是可有可无的2.如果一个类使用 public 修饰,则文件名必须与类名一致3.如果一个类前面没有使用public修饰,则文件名可以与类名不一致.当编译成功后会生成对应类名的 ...