待优化实例:
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");
}
}
}
优化方案:
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.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 | 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 | 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));
}
}
再测试5组数据与之前的进行对比:
次数 | 优化前 | 优化后 | 再优化 |
1 | 1425375971 | 1408538940 | 1513062122 |
2 | 1398468133 | 1244797343 | 1197344393 |
3 | 1375262410 | 1337395806 | 1243512411 |
4 | 1240545487 | 1131249181 | 1198762975 |
5 | 1203541739 | 1237657526 | 1217136038 |
如果数据量跑够大,优化效果会越明显。
谢谢阅读。