将循环变量移入循环

feizm 2010-02-26 10:56:18

清单 7. 将循环变量移入循环

int high = 1;
int low = 1;
int tmp;
for (int i = 1; i < 20; i++) {
System.out.println(high);
tmp = high;
high = high+ low;
low = tmp;
}


到这里还没有结束,经验丰富的 Java 程序员还会将 tmp 变量移入循环,如清单 8 所示:


清单 8. 在循环内声明临时变量

int high = 1;
int low = 1;
for (int i = 1; i < 20; i++) {
System.out.println(high);
int tmp = high;
high = high+ low;
low = tmp;
}


某些极度追求速度而又不够老练的开发人员有时会提出反对意见,认为这种做法导致循环内执行过多操作,而不只是必要的操作,从而降低代码运行速度。实际上,在运行时,声明根本不会执行。将声明移动到循环内绝不会给 Java 平台造成负面的性能影响。


粗体的这句话怎么理解?
...全文
152 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
WuBill 2010-02-27
  • 打赏
  • 举报
回复
路过,不清楚到底那种写法更好
bayougeng 2010-02-27
  • 打赏
  • 举报
回复
引用 11 楼 chen09 的回复:
引用 3 楼 bayougeng 的回复:
我认为这样说是不对的。
循环次数增大时,必然会带来负面影响。
我不明白为什么会说声明不会被执行。如果不执行,那变量如何创建呢?

这话说得很对,lz看的书里面说“某些极度追求速度而又不够老练的开发人员有时会提出反对意见,认为这种做法导致循环内执行过多操作,而不只是必要的操作,从而降低代码运行速度。”,这种语气一看就是无知无畏。

当时,实际上的情况,我们学过编译原理的人都知道,无论是静态优化(编译时)还是动态优化(运行时),那代码的确会被优化,所以没有区别。

3 楼说的“循环次数增大时,必然会带来负面影响。”,虽然实际情况未必如此,但是作为一个程序员,还是应该意识到这点,在写程序阶段就意识到效率,不要什么都交给编译器和运行环境。


是的,如果采用了优化的写法,即使没有选择友好的编译器,也能得到比较高效的class。
musiclee 2010-02-27
  • 打赏
  • 举报
回复
看看 c语言 int i;的汇编 就知道啦 ,声明变量i 没有赋值的话 在汇编中只有空间 没有操作 ,等真正调用i时(赋值或用算)才引用i地址的内存进行操作
chen09 2010-02-27
  • 打赏
  • 举报
回复
引用 3 楼 bayougeng 的回复:
我认为这样说是不对的。
循环次数增大时,必然会带来负面影响。
我不明白为什么会说声明不会被执行。如果不执行,那变量如何创建呢?


这话说得很对,lz看的书里面说“某些极度追求速度而又不够老练的开发人员有时会提出反对意见,认为这种做法导致循环内执行过多操作,而不只是必要的操作,从而降低代码运行速度。”,这种语气一看就是无知无畏。

当时,实际上的情况,我们学过编译原理的人都知道,无论是静态优化(编译时)还是动态优化(运行时),那代码的确会被优化,所以没有区别。

3 楼说的“循环次数增大时,必然会带来负面影响。”,虽然实际情况未必如此,但是作为一个程序员,还是应该意识到这点,在写程序阶段就意识到效率,不要什么都交给编译器和运行环境。
pauliuyou 2010-02-27
  • 打赏
  • 举报
回复
这个差异不是很大吧,局部变量都在栈区,只不过访问范围有不同而已
knightzhuwei 2010-02-26
  • 打赏
  • 举报
回复
反编译一下不就知道了么
1by1 2010-02-26
  • 打赏
  • 举报
回复
问题是对象。
两种写法绝对两样的结果
feizm 2010-02-26
  • 打赏
  • 举报
回复
引用 6 楼 py330316117 的回复:
引用 5 楼 feizm 的回复:这句话理解起来,难道不同的编译器都是采用了同样的优化策略?
和编译器没有关系,都是用的jdk进行编译的

你还明白,jdk的版本和厂商也都是不一样的?~
py330316117 2010-02-26
  • 打赏
  • 举报
回复
引用 5 楼 feizm 的回复:
这句话理解起来,难道不同的编译器都是采用了同样的优化策略?

和编译器没有关系,都是用的jdk进行编译的
feizm 2010-02-26
  • 打赏
  • 举报
回复
这句话理解起来,难道不同的编译器都是采用了同样的优化策略?
xubin2468 2010-02-26
  • 打赏
  • 举报
回复
int tmp 在每次循环至此的时候不会被重复声明??
bayougeng 2010-02-26
  • 打赏
  • 举报
回复
我认为这样说是不对的。
循环次数增大时,必然会带来负面影响。
我不明白为什么会说声明不会被执行。如果不执行,那变量如何创建呢?
小贝壳666 2010-02-26
  • 打赏
  • 举报
回复
实际上,在运行时,声明根本不会执行。
指的是int tmp = high; 与tmp = high;执行的内容是一样的。
不知道对不对,看起来好像不对。
soli11722984 2010-02-26
  • 打赏
  • 举报
回复
就是引用不会在内存里新建一个实例

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧