?> 前言

经常使用一些循环,进行耗时计算的操作,特别是 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. Jenkins + SVN/Git + Maven + Docker + 阿里云镜像 + Kubernetes(K8S)

    Jenkins 2361.2 + Maven Integration + SVN/GIT + Docker + 阿里云镜像 + Kubernetes(K8S) 本文用于学习,了解原理,和实际应用,有所 ...

  2. Java 网络编程 —— 异步通道和异步运算结果

    从 JDK7 开始,引入了表示异步通道的 AsynchronousSockerChannel 类和 AsynchronousServerSocketChannel 类,这两个类的作用与 SocketC ...

  3. 图标闪烁CSS

    图标闪烁CSS代码 <!DOCTYPE html> <html> <head> <style> #markerDiv { position: absol ...

  4. MongoDB 和 MySQL 之间有何区别?

    MongoDB 和 MySQL 是两个可用于存储和管理数据的数据库管理系统.MySQL 是一个关系数据库系统,以结构化表格格式存储数据.相比之下,MongoDB 以更灵活的格式将数据存储为 JSON ...

  5. vue学习笔记 五、创建子组件实例

    系列导航 vue学习笔记 一.环境搭建 vue学习笔记 二.环境搭建+项目创建 vue学习笔记 三.文件和目录结构 vue学习笔记 四.定义组件(组件基本结构) vue学习笔记 五.创建子组件实例 v ...

  6. 云网络智慧课堂-Qt程序代码开发规范

    序言: 编程规范可以提升代码可读性,提高可维护性. 目录: 一.命名规范 二.内存管理规范 三.函数方法规范 四.控制语句规范 五.注释规范 六.排版规范 七.版本管理规范 八.界面编程 词义解释:强 ...

  7. 概率图模型 · 蒙特卡洛采样 · MCMC | 非常好的教学视频

    https://www.bilibili.com/video/BV17D4y1o7J2?p=1 非常感谢!感觉学会一点了,应该能写作业了

  8. spring启动流程 (6完结) springmvc启动流程

    SpringMVC的启动入口在SpringServletContainerInitializer类,它是ServletContainerInitializer实现类(Servlet3.0新特性).在实 ...

  9. DC-设计和工艺数据-02

    在 compile之前保存ddc设计文件 check design - 检查文件的连接性和物理性 check design之后可以将未映射的网表写出,如果是几十万级的RTL,如果不写出,设置约束出现问 ...

  10. [转帖]高并发下nginx配置模板

    user web;       # One worker process per CPU core.   worker_processes 8;       # Also set   # /etc/s ...