java 性能优化之 for 循环

本贴最后更新于 2918 天前,其中的信息可能已经时过境迁

完成同样的功能,用不同的代码来实现,性能上可能会有比较大的差别,所以对于一些性能敏感的模块来说,对代码进行一定的优化还是很有必要的。今天就来说一下 Java 代码优化的事情,今天主要聊一下对于 for(while 等同理)循环的优化。

作为三大结构之一的循环,在我们编写代码的时候会经常用到。循环结构让我们操作数组、集合和其他一些有规律的事物变得更加的方便,但是如果我们在实际开发当中运用不合理,可能会给程序的性能带来很大的影响。所以我们还是需要掌握一些技巧来优化我们的代码的。

嵌套循环

  1. stratTime = System.nanoTime();  
  2. for (int i = 0; i < 10000000; i++) {  
  3.     for (int j = 0; j < 10; j++) {  
  4.           
  5.     }  
  6. }  
  7. endTime = System.nanoTime();  
  8. System.out.println("外大内小耗时:"+ (endTime - stratTime));         

应改为:

  1. stratTime = System.nanoTime();  
  2. for (int i = 0; i <10 ; i++) {  
  3.     for (int j = 0; j < 10000000; j++) {  
  4.           
  5.     }  
  6. }  
  7. endTime = System.nanoTime();  
  8. System.out.println("外小内大耗时:"+(endTime - stratTime));  

两者耗时对比:

  1. 外大内小耗时:200192114  
  2. 外小内大耗时:97995997  

由以上对比可知,优化后性能提升了一倍,嵌套循环应该遵循“外小内大”的原则,这就好比你复制很多个小文件和复制几个大文件的区别。

提取与循环无关的表达式

  1. stratTime = System.nanoTime();  
  2. for (int i = 0; i < 10000000; i++) {  
  3.     i=iab;  
  4. }  
  5. endTime = System.nanoTime();  
  6. System.out.println("未提取耗时:"+(endTime - stratTime));  

应改为:

  1. stratTime = System.nanoTime();  
  2. c = a*b;  
  3. for (int i = 0; i < 10000000; i++) {  
  4.     i=i*c;  
  5. }  
  6. endTime = System.nanoTime();  
  7. System.out.println("已提取耗时:"+(endTime - stratTime));  

两者耗时对比:

  1. 未提取耗时:45973050  
  2. 已提取耗时:1955  

代码中 a+b 与我们的循环无关,所以应该把它放到外面,避免重复计算,可以看出,优化后性能提升了好几个数量级,这些是不容忽视的。

消除循环终止判断时的方法调用

  1. stratTime = System.nanoTime();  
  2. for (int i = 0; i < list.size(); i++) {  
  3.       
  4. }  
  5. endTime = System.nanoTime();  
  6. System.out.println("未优化 list 耗时:"+(endTime - stratTime));  

应改为:

  1. stratTime = System.nanoTime();  
  2. int size = list.size();  
  3. for (int i = 0; i < size; i++) {  
  4.       
  5. }  
  6. endTime = System.nanoTime();  
  7. System.out.println("优化 list 耗时:"+(endTime - stratTime));  

两者耗时对比:

  1. 未优化 list 耗时:27375  
  2. 优化 list 耗时:2444  

list.size()每次循环都会被执行一次,这无疑会影响程序的性能,所以应该将其放到循环外面,用一个变量来代替,优化前后的对比也很明显。

异常捕获

  1. stratTime = System.nanoTime();  
  2. for (int i = 0; i < 10000000; i++) {  
  3.     try {  
  4.     } catch (Exception e) {  
  5.     }  
  6. }  
  7. endTime = System.nanoTime();  
  8. System.out.println("在内部捕获异常耗时:"+(endTime - stratTime));  

应改为:

  1. stratTime = System.nanoTime();  
  2. try {  
  3.     for (int i = 0; i < 10000000; i++) {  
  4.     }  
  5. } catch (Exception e) {  
  6.   
  7. }  
  8. endTime = System.nanoTime();  
  9. System.out.println("在外部捕获异常耗时:"+(endTime - stratTime));  

两者耗时对比:

  1. 在内部捕获异常耗时:12150142  
  2. 在外部捕获异常耗时:1955  

大家都知道,捕获异常是很耗资源的,所以不要讲 try catch 放到循环内部,优化后同样有好几个数量级的提升。

性能优化的内容有很多,代码优化只是其中一小部分,我们在日常开发中应养成良好的编码习惯。接下来会跟大家探讨更多关于性能优化的内容,希望大家积极交流指导。

  • 技术

    到底什么才是技术呢?

    88 引用 • 179 回帖 • 4 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • CodeMirror
    2 引用 • 17 回帖 • 177 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    187 引用 • 1021 回帖 • 1 关注
  • 电影

    这是一个不能说的秘密。

    123 引用 • 608 回帖
  • V2Ray
    1 引用 • 15 回帖 • 5 关注
  • 996
    13 引用 • 200 回帖 • 1 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 2 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3203 引用 • 8217 回帖
  • sts
    2 引用 • 2 回帖 • 247 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖
  • Follow
    4 引用 • 12 回帖 • 10 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 508 关注
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    46 引用 • 114 回帖 • 159 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 561 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    268 引用 • 666 回帖 • 1 关注
  • 笔记

    好记性不如烂笔头。

    312 引用 • 794 回帖
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖 • 1 关注
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 34 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    554 引用 • 675 回帖
  • Word
    13 引用 • 41 回帖
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 639 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    92 引用 • 752 回帖
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖 • 1 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    201 引用 • 120 回帖
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1340 回帖
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 5 关注
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    76 引用 • 258 回帖 • 632 关注