嵌套For循环性能优化分析
转载:http://cgs1999.iteye.com/blog/1596671
1、案例描述
某日,在JavaEye上看到一道面试题,题目是这样的:请对以下的代码进行优化
for (int i = 0; i < 1000; i++)for (int j = 0; j < 100; j++)for (int k = 0; k < 10; k++)testFunction (i, j, k);
2、案例分析
从上述代码案例可以看出,不论如何优化,testFunction()执行的次数都是相同的,该部分是不存在优化的可能。那么优化只能从循环变量i,j,k的实例化、初始化、比较、自增等耗时方面来进行分析。首先,分析原题代码循环变量在以上方面的耗时情况:
变量 | 实例化(次数) | 初始化(次数) | 比较(次数) | 自增(次数) |
i | 1 | 1 | 1000 | 1000 |
j | 1000 | 1000 | 1000*100 | 1000*100 |
k | 1000*100 | 1000*100 | 1000*100*10 | 1000*100*10 |
目的: 该代码性能优化就是要尽可能地减少循环变量i、j、k的实例化、初始化、比较、自增的次数,同时不引起其他可能的耗时运算。
3、解决过程
优化方案①:
for (int i = 0; i < 10; i++)for (int j = 0; j < 100; j++)for (int k = 0; k < 1000; k++)testFunction (k, j, i);
该方案主要是将循环次数少的放在外面,循环次数多的放在里层,这样可以最大程度地减少相关循环变量的实例化次数、初始化次数等,方案耗时情况如下:
变量 | 实例化(次数) | 初始化(次数) | 比较(次数) | 自增(次数) |
i | 1 | 1 | 10 | 10 |
j | 10 | 10 | 10*100 | 10*100 |
k | 10*100 | 10*100 | 10*100*1000 | 10*100*1000 |
优化方案②:
int i, j, k;
for (i = 0; i < 10; i++)for (j = 0; j < 100; j++)for (k = 0; k < 1000; k++)testFunction (k, j, i);
该方案主要是在方案①的基础上,将循环变量的实例化放在循环外,这样可以进一步减少实例化次数,耗时情况如下表:
变量 | 实例化(次数) | 初始化(次数) | 比较(次数) | 自增(次数) |
i | 1 | 1 | 10 | 10 |
j | 1 | 10 | 10*100 | 10*100 |
k | 1 | 10*100 | 10*100*1000 | 10*100*1000 |
注:方案②的优势体现在若将i、j、k的数值提高更多的,其提升的效果才更明显。
4、测试代码
public class Test {public static void main(String[] args){
// testA();
// testB();testC();}public static void testA(){long start = System.nanoTime();for(int i = 0; i < 10; i++)for(int j = 0; j < 1000; j++)for(int k = 0; k < 10000; k++);System.out.println("testA time>>"+(System.nanoTime()-start)+"ns");}public static void testB(){long start = System.nanoTime();for(int i = 0; i < 10000; i++)for(int j = 0; j < 1000; j++)for(int k = 0; k < 10; k++);System.out.println("testB time>>"+(System.nanoTime()-start)+"ns");}public static void testC(){long start = System.nanoTime();int i, j, k;for(i = 0; i < 10; i++)for(j = 0; j < 1000; j++)for(k = 0; k < 10000; k++);System.out.println("testC time>>"+(System.nanoTime()-start)+"ns");}
}
嵌套For循环性能优化分析相关推荐
- 嵌套For循环性能优化
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1 案例描述 某日,在JavaEye上看到一道面试题,题目是这样的:请对以下的代码进行优化 Java ...
- mysql如何建立索引workbench_如何对MySQL索引进行优化分析
为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字段的意义.助你了解索引, ...
- seo html空格影响,这一对HTML标签嵌套对SEO优化的影响,居然99%的人不知道!
最常见的A标签和H标签该如何正确嵌套?网站中几乎随处可见,HTML的标签不论你怎么使用都是可以正常解析,被浏览器完整地渲染出想要的效果,所以很少有人会关注HTML标签的嵌套规则.而在SEO优化中a标签 ...
- MySQL索引优化分析
转载来源:https://www.cnblogs.com/itdragon/p/8146439.html MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学 ...
- 第 2 章 索引优化分析
第 2 章 索引优化分析 1.慢 SQL 性能下降. SQL 慢.执行时间长.等待时间长的原因分析 查询语句写的烂 索引失效: 单值索引:在user表中给name属性建个索引,create index ...
- html 3重嵌套选项卡,这对HTML标签嵌套在SEO优化上,其实99%的人都不知道!
如何正确嵌套常见的a和H标记?几乎在网站的任何地方,HTML标签都可以被正常解析,不管你如何使用它们.它们完全由浏览器呈现,因此很少有人会注意HTML标记的嵌套规则.在SEO优化中,标签和H标签的不恰 ...
- 第2章 索引优化分析
第2章 索引优化分析 1 慢SQL 性能下降.SQL慢.执行时间长.等待时间长的原因分析 查询语句写的烂 索引失效: 单值索引:在user表中给name属性建个索引,create index idx_ ...
- 双目标帕累托优化_结构力学中的优化分析(3) —— 结构优化分析
引言 上文中,我们主要介绍了优化分析的基本类型. 蒙特遇见卡罗:结构力学中的优化分析(1) -- 优化方法基本概念zhuanlan.zhihu.com 蒙特遇见卡罗:结构力学中的优化分析(2) -- ...
- oracle 语法分析表,Oracle 语句优化分析说明
Oracle 语句优化分析说明 更新时间:2009年09月17日 21:52:20 作者: Oracle 语句优化技巧,大家可以参考使用,使你的oracle运行效率更高更好. 1. ORACLE ...
最新文章
- Java基础之一组有用的类——生成日期和时间(TryDateFormats)
- SqliteHelper整理
- Spring Boot中表格的请求以及表格界面的显示
- java 中的scanner_java 中的Scanner
- 一杯水怎么测试_天气渐热食欲差、体质虚怎么办?每天一杯能量水——驼奶
- 魔域java_java序列化
- Mac用bootcamp安装Windows 11双系统
- android 自定义多边形,android自定义形状的按键实例代码
- 又读《孙子兵法》,谈领导力
- 程序员开发常用英语词汇
- Linux7 下Hadoop集群用户管理方案之五 安装Hadoop集群遇到的坑
- Jacob 操作 outlook 发邮件 遍历文件夹邮件 移动邮件
- 三人行新解:前辈、平辈和后辈
- 定时任务的多种实现——xxl-job
- python编程基础与数据分析_Python编程基础与数据分析
- php中插入word文档,word里如何插入pdf
- 虚拟内存与虚拟存储器的区别
- 抓虾 — Bloglines Plus
- 树莓派入门(三)之步进电机控制
- 相似图片搜索原理二(phash—c++实现)