嵌套For循环性能优化
【摘要】 待优化实例:
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)