《java优化编程》里面这样说:
”最好避免在循环体内部存取数组元素,比较好的方法:在循环体内部采用临时变量,在循环体外更改数组的值,这是因为在循环体内使用变量比存取数组元素更快“
本人对这句话不太明白,有没有朋友根据原文,给我来一小段代码的例子呢?谢谢了

解决方案 »

  1.   

    String aa[] = new String[]{"aa"};for(int i=0;i<aa.length;i++)
    {
    String temp=aa[i];//这里使用临时变量 来引用aa[i];
    System.out.println(temp);
    //可能还有其它的地方使用temp
    }就是不要每次都用aa[i]去访问.我估计是这样的.
      

  2.   

    我想也是如1楼所说吧,不过如果把aa.leng改成一个常量,估计效果会更好int length = aa.length;
    //因为每次比较的时候都要读取aa的length属性,不知道这样对不对?
    for(int i=0;i <length;i++) 

    String temp=aa[i];//这里使用临时变量 来引用aa[i]; 
    System.out.println(temp); 
    //可能还有其它的地方使用temp 
    }
      

  3.   

    待高手来解决,
    问下楼主《java优化编程》怎么样
      

  4.   

    我想也是如1楼所说吧,不过如果把aa.leng改成一个常量,估计效果会更好 恩,应该是这样.
      

  5.   

    ---对了,数组的length好像就是一个长量来的,创建好就是一个值了.并不需要每次都去计算.
      

  6.   

    循环内使用一个临时变量保存遍历到的值
    借用上面的代码int length = aa.length;//至于保存数组的长度,我认为无所谓,因为length是数组的一个属性
    for(int i=0;i <length;i++) 

    String temp=aa[i];//这里使用临时变量 来引用aa[i]; 
    //这里如果是多次使用的话,就有必要了
    //因为使用临时变量的访问速度要比使用aa[i]这种使用数组[下标]的方式访问速度快
    System.out.println(temp); 
    //可能还有其它的地方使用temp 
    }
      

  7.   

    我的猜想是:首先aa要寻址一次,下标再寻址一次
    又或是
    aa+偏移量计算一次,寻址一次与一次定位的局部变量比,你说哪个快呢?
      

  8.   


    答:多此一举!(网络上错误的观点或误导人的观点真是多啊)
    理由:任何一个鸲得上称为商业级或工业级或专业级强度的JAVA编译器产品,对生成的目标代码都有很彻底的优化,而循环的优化更是重中之重.像楼主这一类的"小儿科"级别的优化(循环内的a[i]这人公共子表达式的优化),更是优化了.不仅如此,许多的优化,是超出你的想像的(如:循环变量的下标运算强度削减,循环内常量表达式的代码外提,合并已知常量表达式并外提(这就是大家看到的:"a"+"b"这种常量表达式,在编译时就合并已知常量表达式了)).等等.
    为何大家看不到优化代码呢?这就是"DEBUG"版与"生产发行版"之间的区别!(DEBUG"版很少做优化,目的是:目标优化与源程序代码有对应关系.若是"生产发行版",彻底优化后,目标优化与源程序代码有对应关系就没有了,不好调试程序.)
    因此:这种"小儿科"级别的代码层次的优化,你少操心.你的真正任务是:对算法进行真正的优化,这是编译程序做不到的.这种低层次代码级别的优化,鸲得上称为商业级或工业级或专业级强度的JAVA编译器产品,比你做得强多了.
      

  9.   

    你能举个具体的例子说明编译器的优化吗?
    看过一些java编译器的代码,感觉java的编译器还不是一个很好的优化编译器。
      

  10.   

    谢谢大家给我解答,
    这本书我是看的pdf的,每天下班回家看,4天基本看完了(主要章节),感觉还是有一点帮助的,呵呵!我在爱书吧下载的,有喜欢的朋友可以去下载!本人所在公司规模不大,编程也不是很正规,基本上上想怎么编就怎么编,功能出来就行的那种。所以我特想规范一下自己的编程,到处找书看!苦恼啊!
    总之谢谢大家,呵呵,尤其是jiangnaisong