for循环实战性能优化
完成同样的功能,用不同的代码来实现,性能上可能会有比较大的差别,所以对于一些性能敏感的模块来说,对代码进行一定的优化还是很有必要的。今天就来说一下java代码优化的事情,今天主要聊一下对于for(while等同理)循环的优化,它作为三大结构之一的循环,在我们编写代码的时候会经常用到。循环结构让我们操作数组、集合和其他一些有规律的事物变得更加的方便,但是如果我们在实际开发当中运用不合理,可能会给程序的性能带来很大的影响。所以我们还是需要掌握一些技巧来优化我们的代码的。
1 嵌套循环
private static void bigSmall() {
long stratTime = System.nanoTime();
for (int i = 0; i < 10000000; i++) {
for (int j = 0; j < 100; j++) { }
}
long endTime = System.nanoTime();
System.out.println("外大内小耗时:" + (endTime - stratTime));
}
上面是大循环驱动小循环,优化后改为小循环驱动大循环:
private static void smallBig() {
long stratTime = System.nanoTime();
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 10000000; j++) { }
}
long endTime = System.nanoTime();
System.out.println("外小内大耗时:" + (endTime - stratTime));
}
两者耗时对比:
外大内小耗时:756859726
外小内大耗时:451345484
由以上对比可知,优化后性能显著提升。嵌套循环应该遵循“外小内大”的原则,这就好比你复制很多个小文件和复制几个大文件的区别。
2 循环变量的实例化应放在循环外
在第1节优化后的代码基础上,进行二次优化:
private static void smallBigBetter() {
long stratTime = System.nanoTime();
int i, j;
for (i = 0; i < 100; i++) {
for (j = 0; j < 10000000; j++) { }
}
long endTime = System.nanoTime();
System.out.println("外小内大并且提取出循环内变量耗时:" + (endTime - stratTime));
}
执行结果:
外小内大并且提取出循环内变量耗时:445302240
虽然优化效果并不明显,但是随着循环次数的增加,耗时会越来越大,优化效果则会越来越明显。分析:优化前需要实例化1+i=101次,优化后仅仅2次。
3 提取与循环无关的表达式
private static void calculationInner() {
int a = 3;
int b = 7;
long stratTime = System.nanoTime();
for (int i = 0; i < 10000000; i++) {
i = i * a * b;
}
long endTime = System.nanoTime();
System.out.println("未提取耗时:" + (endTime - stratTime)); }
优化后:
private static void calculationOuter() {
int a = 3;
int b = 7;
int c = a * b;
long stratTime = System.nanoTime();
for (int i = 0; i < 10000000; i++) {
i = i * c;
}
long endTime = System.nanoTime();
System.out.println("已提取耗时:" + (endTime - stratTime));
}
代码中a*b与循环无关,所以应该把它放到外面,避免重复计算。从理论角度分析,由于减少了计算次数,故优化后性能会更高。
4 消除循环终止判断时的方法调用
stratTime = System.nanoTime();
for (int i = 0; i < list.size(); i++) { }
endTime = System.nanoTime();
System.out.println("未优化list耗时:"+(endTime - stratTime));
优化后的代码:
stratTime = System.nanoTime();
int size = list.size();
for (int i = 0; i < size; i++) { }
endTime = System.nanoTime();
System.out.println("优化list耗时:"+(endTime - stratTime));
每次循环,list.size()都会被执行一次,这无疑会影响程序的性能,所以应该将其放到循环外面,用一个变量来缓存其size,不要让这一点点代码而消耗我们这么多性能。
5 异常捕获
在内部捕获异常:
private static void catchInner() {
long stratTime = System.nanoTime();
for (int i = 0; i < 10000000; i++) {
try {
} catch (Exception e) {
}
}
long endTime = System.nanoTime();
System.out.println("在内部捕获异常耗时:" + (endTime - stratTime));
}
在外部捕获异常:
private static void catchOuter() {
long stratTime = System.nanoTime();
try {
for (int i = 0; i < 10000000; i++) {
}
} catch (Exception e) { }
long endTime = System.nanoTime();
System.out.println("在外部捕获异常耗时:" + (endTime - stratTime));
}
结果对比:
在内部捕获异常耗时:6105716
在外部捕获异常耗时:5465381
捕获异常很占用资源,所以不要把try catch放到循环内部,优化后性能同样有好几个数量级的提升。另外, 《Effective Java》一书指出for-each循环优先于传统的for循环,它在简洁性和预防bug方面有着传统for循环无法媲美的优势,并且,没有性能方面的损失,因此,推荐使用for-each循环。
for循环实战性能优化的更多相关文章
- for循环实战性能优化之使用Map集合优化
笔者在<for循环实战性能优化>中提出了五种提升for循环性能的优化策略,这次我们在其中嵌套循环优化小循环驱动大循环的基础上,借助Map集合高效的查询性能来优化嵌套for循环 ...
- MongoDB实战性能优化
1. 性能优化分类 mongodb性能优化分为软件层面和操作系统层面. 软件层面,一般通过修改mongodb软件配置参数来达到,这个需要非常熟悉mongodb里面的各种配置参数: 而操作系统层面,相对 ...
- spring+ehcache实战--性能优化之道
在做系统集成平台项目的时候遇到了一个比較麻烦的问题.原因是使用考试系统的时候所依赖的是基础系统公布的webservice来获取基础数据,webservice的跨网络传输本身或多或少会对系统性能产生一定 ...
- javascript循环---性能优化
循环是编程中是最为常见的结构,优化循环是性能优化中很重要的一个部分. 减值迭代:大多数循环使用一个从0开始.增加到某个特定值的迭代器.在很多情况下,从最大值开始,在循环中不断减值的迭代器更加高效. 简 ...
- 一文学会JVM性能优化
实战性能优化 1 重新认知JVM 之前我们画过一张图,是从Class文件到类装载器,再到运行时数据区的过程,现在咱们把这张图不妨丰富完善一下,展示了JVM的大体物理结构图. 执行引擎:用于执行JVM字 ...
- js 性能优化 篇一
JS性能优化 摘自:http://www.china125.com/design/js/3631.htm 首先,由于JS是一种解释型语言,执行速度要比编译型语言慢得多.(注:,Chrome是第一款内 ...
- SQL Server 性能优化之RML Utilities:快速入门(Quick Start)(1)
SQL Server 性能优化之RML Utilities:快速入门(Quick Start)(1) 安装Quick Start工具 RML(Replay Markup Language)是MS ...
- Android UI性能优化实战, 识别View中的性能问题
出自:[张鸿洋的博客]来源:http://blog.csdn.net/lmj623565791/article/details/45556391 1.概述 2015年初google发布了Android ...
- iOS性能优化:Instruments使用实战
iOS性能优化:Instruments使用实战 最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下. Instrument ...
随机推荐
- 在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名)
原文:在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- SringMVC笔记
SpringMvc主要是三个Servlet:HttpServletBean,FramwworkServlet,DispatcherServlet,它们是依次继承的关系,其处理过程大致功能如下: 1.H ...
- iOS - 苹果官方Apple Pay开发文档(中文版)- Apple Pay(1)
翻译自苹果官方Apple Pay开发文档.目前版本为1.0 概览: Apple Pay为用户从你的App里购买实际的物品和服务提供简单而安全的方法.通过Touch ID,用户可使用储存在iPhone ...
- bootstrap-table分页
首先引用css: <link rel="stylesheet" type="text/css" href="css/bootstrap.css& ...
- [networking][sdn] BGP/EGP/IGP是什么
引子 这是一个惊悚的故事,胆小的人不要点开.整个故事,是从这张图开始的. 整个图,分左中右三块.左边是tom和他所在的网络.右边是jerry和他所在的网络.这两个网络可以在世界上的任何一个角落.彼此有 ...
- Go数据类型之基本数据类型
不想沦为芸芸众生的人只需做一件事,便是对自己不再散漫:他应当听从良知的呼唤:“成为你自己!” ---尼采 1.整型 有符号整数类型:int8.int16.int32和int64 无符号整数类型:uin ...
- 【OF框架】使用OF.WinService项目,添加定时服务,进行创建启动停止删除服务操作
准备 使用框架搭建完成项目,包含OF.WinService项目. 了解Window Service 和定时服务相关知识. 一.添加一个定时服务 第一步:了解项目结构 第二步:创建一个新的Job 第三步 ...
- Usages for IntelliJ & Eclipse
IntelliJ ⌘E Select a recently opened file from the list. ⌘/ (left command + /)⌥⌘/ (right command + / ...
- 基本排序-冒泡/选择/插入(python)
# -*- coding: utf-8 -*- import random def bubble_sort(seq): n = len(seq) for i in range(n-1): print( ...
- Jenkins构建自动化--实例一
1.新建任务 2.配置任务 3.构建任务 5.构建完成后,可以点击任务名称查看结果