优化以下代码
for(int i=0;i<1000;i++){
   for(int j=0;j<100;j++){
      for(int k=0;k<10;k++){
         function(i,j,k);
      }
   }
}

解决方案 »

  1.   

    for(int k=0;k <10;k++){ 
      for(int j=0;j <100;j++){ 
          for(int i=0;i <1000;i++){ 
            function(i,j,k); 
          } 
      } 
    }
      

  2.   

    听说 -- 比 ++快!for(int k=9;k >=0;k--){
      for(int j=99;j >=0;j--){
          for(int i=999;i >=0;i--){
            function(i,j,k);
          }
      }
    }
      

  3.   

    如果不能改变function的调用次序:for(int n=0;n <1000000;n++){ 
      
            function(n/1000,n/10,k%10); }少了内层的逻辑判断,但/和%的运算没有++快,不知道这样算不算优化。
      

  4.   

    int k=0,j=0,i=0;
    for(k=0;k <10;k++){ 
      for(j=0;j <100;j++){ 
          for(i=0;i <1000;i++){ 
            function(i,j,k); 
          } 
      } 
    }
    这会不会更好点?
    还有其他的优化方案吗?
      

  5.   

    外面分配和里面分配都 一样,都是分配3个int,没有区别。
      

  6.   

    这个算是 for(int k=9;k >=0;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毫秒
      

  7.   

    我做的测试
    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
      

  8.   

    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 的作用域已经结束了,
    于是又新分配了一个空间
    难道不是这样的吗?
      

  9.   


    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
      

  10.   

    重新做了一次测试 悲观地发现其实好像并没有优化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]));
                
                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