for 内的声明应该是有作用域的吧,for (int i = 0; i < 10; i++) { for (int j = 0; j < 100; j++) { for (int k = 0; k < 1000; k++) { ... } } }里面的 k, 在 j = 0 时, 分配一个空间, 当 j = 1 时, 上一个 k 的作用域已经结束了, 于是又新分配了一个空间 难道不是这样的吗?
public class Test { public static void main(String[] arg) {
int count = 8; long[] ave = new long[] {0, 0, 0, 0};
for (int l = 0; l < count; l++) {
long[] temp = new long[5];
temp[0] = System.currentTimeMillis(); for (int i = 0; i < 1000; i++) for (int j = 0; j < 100; j++) for (int k = 0; k < 10; k++) f(k, j, i); temp[1] = System.currentTimeMillis(); for (int i = 0; i < 10; i++) for (int j = 0; j < 100; j++) for (int k = 0; k < 1000; k++) f(k, j, i); temp[2] = System.currentTimeMillis(); for (int i = 10; i > 0; i--) for (int j = 100; j > 0; j--) for (int k = 1000; k > 0; k--) f(k, j, i); temp[3] = System.currentTimeMillis();
int i, j, k; for (i = 10; i > 0; i--) for (j = 100; j > 0; j--) for (k = 1000; k > 0; k--) f(k, j, i); temp[4] = System.currentTimeMillis(); System.out.println("Time1:" + (temp[1] - temp[0]) + " Time2:" + (temp[2] - temp[1]) + " Time3:" + (temp[3] - temp[2]) + " Time4:" + (temp[4] - temp[3]));
重新做了一次测试 悲观地发现其实好像并没有优化public class AP1 { public static void main(String[] arg) {
int count = 12; long[] ave = new long[] {0, 0, 0, 0};
for (int l = 0; l < count; l++) {
long[] temp = new long[5];
temp[0] = System.currentTimeMillis(); for (int i = 0; i < 1000; i++) for (int j = 0; j < 100; j++) for (int k = 0; k < 10; k++) f(k, j, i); temp[1] = System.currentTimeMillis(); for (int i = 0; i < 10; i++) for (int j = 0; j < 100; j++) for (int k = 0; k < 1000; k++) f(k, j, i); temp[2] = System.currentTimeMillis(); for (int i = 1000; i > 0; i--) for (int j = 100; j > 0; j--) for (int k = 10; k > 0; k--) f(k, j, i); temp[3] = System.currentTimeMillis();
int i, j, k; for (i = 1000; i > 0; i--) for (j = 100; j > 0; j--) for (k = 10; k > 0; k--) f(k, j, i); temp[4] = System.currentTimeMillis(); System.out.println("Time1:" + (temp[1] - temp[0]) + " Time2:" + (temp[2] - temp[1]) + " Time3:" + (temp[3] - temp[2]) + " Time4:" + (temp[4] - temp[3]));
for(int j=0;j <100;j++){
for(int i=0;i <1000;i++){
function(i,j,k);
}
}
}
for(int j=99;j >=0;j--){
for(int i=999;i >=0;i--){
function(i,j,k);
}
}
}
function(n/1000,n/10,k%10); }少了内层的逻辑判断,但/和%的运算没有++快,不知道这样算不算优化。
for(k=0;k <10;k++){
for(j=0;j <100;j++){
for(i=0;i <1000;i++){
function(i,j,k);
}
}
}
这会不会更好点?
还有其他的优化方案吗?
for(int j=99;j >=0;j--){
for(int i=999;i >=0;i--){
System.out.print("");
}
}
}
比
for(long i=0;i <1000;i++){
for(long j=0;j <100;j++){
for(long k=0;k <10;k++){
System.out.print("");
}
}
}
省了15毫秒
import java.util.Date;public class AP1 {
public static void main(String[] args) {
for(int l=0;l<8;l++){
long t1=new Date().getTime();
for(int i=0;i<1000;i++)
for(int j=0;j<100;j++)
for(int k=0;k<10;k++)
f(k,j,i);
long t2=new Date().getTime();
for(int i=0;i<10;i++)
for(int j=0;j<100;j++)
for(int k=0;k<1000;k++)
f(k,j,i);
long t3=new Date().getTime();
for(int i=10;i>0;i--)
for(int j=100;j>0;j--)
for(int k=1000;k>0;k--)
f(k,j,i);
long t4=new Date().getTime();
System.out.println("Time1:"+(t2-t1)+" Time2:"+(t3-t2)+" Time3:"+(t4-t3));
}
}
static void f(int i,int j,int k){
for(int m=0;m<1000;m++)
i=j+k;
}
}运行结果:
Time1:1185 Time2:1139 Time3:1123
Time1:1156 Time2:1123 Time3:1123
Time1:1155 Time2:1139 Time3:1123
Time1:1156 Time2:1123 Time3:1123
Time1:1156 Time2:1138 Time3:1124
Time1:1155 Time2:1123 Time3:1123
Time1:1156 Time2:1123 Time3:1123
Time1:1156 Time2:1138 Time3:1124
for (int j = 0; j < 100; j++) {
for (int k = 0; k < 1000; k++) {
...
}
}
}里面的 k, 在 j = 0 时, 分配一个空间,
当 j = 1 时, 上一个 k 的作用域已经结束了,
于是又新分配了一个空间
难道不是这样的吗?
public class Test { public static void main(String[] arg) {
int count = 8;
long[] ave = new long[] {0, 0, 0, 0};
for (int l = 0; l < count; l++) {
long[] temp = new long[5];
temp[0] = System.currentTimeMillis(); for (int i = 0; i < 1000; i++)
for (int j = 0; j < 100; j++)
for (int k = 0; k < 10; k++)
f(k, j, i);
temp[1] = System.currentTimeMillis(); for (int i = 0; i < 10; i++)
for (int j = 0; j < 100; j++)
for (int k = 0; k < 1000; k++)
f(k, j, i); temp[2] = System.currentTimeMillis(); for (int i = 10; i > 0; i--)
for (int j = 100; j > 0; j--)
for (int k = 1000; k > 0; k--)
f(k, j, i); temp[3] = System.currentTimeMillis();
int i, j, k;
for (i = 10; i > 0; i--)
for (j = 100; j > 0; j--)
for (k = 1000; k > 0; k--)
f(k, j, i);
temp[4] = System.currentTimeMillis();
System.out.println("Time1:" + (temp[1] - temp[0]) + " Time2:" + (temp[2] - temp[1])
+ " Time3:" + (temp[3] - temp[2]) + " Time4:" + (temp[4] - temp[3]));
ave[0] += (temp[1] - temp[0]);
ave[1] += (temp[2] - temp[1]);
ave[2] += (temp[3] - temp[2]);
ave[3] += (temp[4] - temp[3]);
}
System.out.println("------------------------------------------");
System.out.println("Time1:" + (ave[0] / count) + " Time2:" + (ave[1] / count)
+ " Time3:" + (ave[2] / count) + " Time4:" + (ave[3] / count)); } static void f(int i, int j, int k) {
for (int m = 0; m < 100; m++)
i = j + k;
}
}
我的测试结果:Time1:344 Time2:234 Time3:344 Time4:187
Time1:344 Time2:234 Time3:344 Time4:188
Time1:343 Time2:235 Time3:344 Time4:171
Time1:344 Time2:219 Time3:343 Time4:188
Time1:344 Time2:250 Time3:343 Time4:188
Time1:344 Time2:234 Time3:328 Time4:188
Time1:359 Time2:219 Time3:343 Time4:188
Time1:344 Time2:234 Time3:344 Time4:172
------------------------------------------
Time1:345 Time2:232 Time3:341 Time4:183
int count = 12;
long[] ave = new long[] {0, 0, 0, 0};
for (int l = 0; l < count; l++) {
long[] temp = new long[5];
temp[0] = System.currentTimeMillis(); for (int i = 0; i < 1000; i++)
for (int j = 0; j < 100; j++)
for (int k = 0; k < 10; k++)
f(k, j, i);
temp[1] = System.currentTimeMillis(); for (int i = 0; i < 10; i++)
for (int j = 0; j < 100; j++)
for (int k = 0; k < 1000; k++)
f(k, j, i); temp[2] = System.currentTimeMillis(); for (int i = 1000; i > 0; i--)
for (int j = 100; j > 0; j--)
for (int k = 10; k > 0; k--)
f(k, j, i); temp[3] = System.currentTimeMillis();
int i, j, k;
for (i = 1000; i > 0; i--)
for (j = 100; j > 0; j--)
for (k = 10; k > 0; k--)
f(k, j, i);
temp[4] = System.currentTimeMillis();
System.out.println("Time1:" + (temp[1] - temp[0]) + " Time2:" + (temp[2] - temp[1])
+ " Time3:" + (temp[3] - temp[2]) + " Time4:" + (temp[4] - temp[3]));
ave[0] += (temp[1] - temp[0]);
ave[1] += (temp[2] - temp[1]);
ave[2] += (temp[3] - temp[2]);
ave[3] += (temp[4] - temp[3]);
}
System.out.println("------------------------------------------");
System.out.println("Time1:" + (ave[0] / count) + " Time2:" + (ave[1] / count)
+ " Time3:" + (ave[2] / count) + " Time4:" + (ave[3] / count)); } static void f(int i, int j, int k) {
int n=0;
for (int m = 0; m < 300; m++)
n++;
}
}结果
Time1:359 Time2:343 Time3:343 Time4:359
Time1:344 Time2:343 Time3:344 Time4:358
Time1:345 Time2:343 Time3:343 Time4:359
Time1:345 Time2:343 Time3:343 Time4:359
Time1:344 Time2:344 Time3:343 Time4:343
Time1:344 Time2:343 Time3:359 Time4:343
Time1:346 Time2:343 Time3:343 Time4:343
Time1:344 Time2:359 Time3:343 Time4:344
Time1:345 Time2:343 Time3:343 Time4:359
Time1:345 Time2:343 Time3:344 Time4:343
Time1:345 Time2:343 Time3:343 Time4:359
Time1:345 Time2:344 Time3:343 Time4:359
------------------------------------------
Time1:345 Time2:344 Time3:344 Time4:352