嵌套For循环性能优化

举报
yd_221104950 发表于 2020/12/04 00:48:29 2020/12/04
【摘要】 待优化实例: for(int i = 0;i < 1000;i++){ for(int j = 0;j < 100;j++){ for(int k = 0; k < 10;k++){ System.out.print("hello world"); } } } 12345678 优化方案: for(int i = 0;i < 10;i++...

待优化实例:

for(int i = 0;i < 1000;i++){ for(int j = 0;j < 100;j++){ for(int k = 0; k < 10;k++){ System.out.print("hello world"); } } }


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

优化方案:

for(int i = 0;i < 10;i++){ for(int j = 0;j < 100;j++){ for(int k = 0; k < 1000;k++){ System.out.print("hello world"); } } }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

优化方案分析

从待优化实例的代码来看,无论如何优化,System.out.print(“hello world”)执行的次数都是相同的,因此,该部分不存在优化的可能。所以,代码的优化只能从循环变量i、j、k的实例化、初始化、比较、自增等方面的耗时上进行优化。

首先,待优化实例里的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的变化如下:

变量 实例化(次数) 初始化(次数) 比较(次数) 自增(次数)
i 1 1 10 10
j 10 10 10*100 10*100
k 10*100 10*100 10*100*1000 10*100*1000

通过上述分析我们可以得知,待优化实例里的i、j、k产生的实例远多于优化后的实例,因此猜测优化是有效的,我们通过测试几组数据来对比一下:

优化前

测试代码:

public class Main { public static void main(String[] args) { long startA = System.nanoTime(); for(int i = 0;i < 1000;i++){ for(int j = 0;j < 100;j++){ for(int k = 0; k < 10;k++){ System.out.print("hello world"); } } } System.out.println("A耗时#"+(System.nanoTime() - startA)); }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

测试结果

次数 耗时
1 1425375971
2 1398468133
3 1375262410
4 1240545487
5 1203541739

优化后

测试代码:

public class Main { public static void main(String[] args) { long startA = System.nanoTime(); for(int i = 0;i < 10;i++){ for(int j = 0;j < 100;j++){ for(int k = 0; k < 1000;k++){ System.out.print("hello world"); } } } System.out.println("A耗时#"+(System.nanoTime() - startA)); }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

测试结果

次数 耗时
1 1408538940
2 1244797343
3 1337395806
4 1131249181
5 1237657526

对比两次测试结果,得出优化有效:

次数 优化前 优化后
1 1425375971 1408538940
2 1398468133 1244797343
3 1375262410 1337395806
4 1240545487 1131249181
5 1203541739 1237657526

综合上述,我们可以得知要优化嵌套for循环就是要减少临时变量的实例化次数和初始化次数

再优化

通过减少临时变量的实例化次数进行优化:

public class Main { public static void main(String[] args) { int i = 0; int j = 0; int k = 0; long startA = System.nanoTime(); for(i = 0;i < 10;i++){ for(j = 0;j < 100;j++){ for(k = 0; k < 1000;k++){ System.out.print("hello world"); } } } System.out.println("A耗时#"+(System.nanoTime() - startA)); }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

再测试5组数据与之前的进行对比:

次数 优化前 优化后 再优化
1 1425375971 1408538940 1513062122
2 1398468133 1244797343 1197344393
3 1375262410 1337395806 1243512411
4 1240545487 1131249181 1198762975
5 1203541739 1237657526 1217136038

如果数据量跑够大,优化效果会越明显。

谢谢阅读。

文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_40763897/article/details/98487577

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。