论坛首页 Java企业应用论坛

代码难道不是这么写的?

浏览 66466 次
该帖已经被评为良好帖
作者 正文
   发表时间:2010-07-28  
ahuaxuan 写道
dennis_zane 写道

为了免的某些人再扯淡,我将编译后的字节码贴出来:
args.length就是一条指令ARRAYLENGTH,哪怕你存到变量len里,也要一条LOAD指令。
两个循环区别仅仅在局部变量的索引上。

======================
有人是做j2me之类的移动设备的, 一般上他们认为
for (int k =0; k < ArrayList.getSize();k++)


int len = ArrayList.getSize()
for (int k =0; k < len;k++)
要多出多个个方法栈帧的操作。
但是在j2se上,这种消耗根本不值一提。

而对于array.length.这就是一个变量访问,这个是肯定的。不会有什么消耗(即使是在j2me中)



在Java中数组是不能改变长度,因此array.length是一个数组对象的元素据(常量)。

貌似,JVM里面有C栈和Java栈共存,能够结合改例子解释一下。
0 请登录后投票
   发表时间:2010-07-28  
ahuaxuan 写道
dennis_zane 写道

为了免的某些人再扯淡,我将编译后的字节码贴出来:
args.length就是一条指令ARRAYLENGTH,哪怕你存到变量len里,也要一条LOAD指令。
两个循环区别仅仅在局部变量的索引上。

======================
有人是做j2me之类的移动设备的, 一般上他们认为
for (int k =0; k < ArrayList.getSize();k++)


int len = ArrayList.getSize()
for (int k =0; k < len;k++)
要多出多个个方法栈帧的操作。
但是在j2se上,这种消耗根本不值一提。

而对于array.length.这就是一个变量访问,这个是肯定的。不会有什么消耗(即使是在j2me中)


list.size()也就多了一条指令的开销,当然,invokeinterface或者invokevirutal会慢一些,这是肯定,通常情况下根本不需要考虑这些。我没搞过j2me,不敢妄下结论,也许j2me的jvm比较不同。
1 请登录后投票
   发表时间:2010-07-28   最后修改:2010-07-28
dennis_zane 写道
ahuaxuan 写道
dennis_zane 写道

为了免的某些人再扯淡,我将编译后的字节码贴出来:
args.length就是一条指令ARRAYLENGTH,哪怕你存到变量len里,也要一条LOAD指令。
两个循环区别仅仅在局部变量的索引上。

======================
有人是做j2me之类的移动设备的, 一般上他们认为
for (int k =0; k < ArrayList.getSize();k++)


int len = ArrayList.getSize()
for (int k =0; k < len;k++)
要多出多个个方法栈帧的操作。
但是在j2se上,这种消耗根本不值一提。

而对于array.length.这就是一个变量访问,这个是肯定的。不会有什么消耗(即使是在j2me中)


list.size()也就多了一条指令的开销,当然,invokeinterface或者invokevirutal会慢一些,这是肯定,通常情况下根本不需要考虑这些。我没搞过j2me,不敢妄下结论,也许j2me的jvm比较不同。



严重支持,我真的不知道怎么那么多人说要消耗堆内存,要使用的对象已经早就存在于堆内存了。难道你们认为那些对象是每循环一次就创建一个?搞笑!
0 请登录后投票
   发表时间:2010-07-28  
都闲得蛋痛!!中国牛人多,怎么看牛的程序,软件,计算机都是人家老外牛啊~~~
0 请登录后投票
   发表时间:2010-07-28  
dennis_zane 写道
ahuaxuan 写道
dennis_zane 写道

为了免的某些人再扯淡,我将编译后的字节码贴出来:
args.length就是一条指令ARRAYLENGTH,哪怕你存到变量len里,也要一条LOAD指令。
两个循环区别仅仅在局部变量的索引上。

======================
有人是做j2me之类的移动设备的, 一般上他们认为
for (int k =0; k < ArrayList.getSize();k++)


int len = ArrayList.getSize()
for (int k =0; k < len;k++)
要多出多个个方法栈帧的操作。
但是在j2se上,这种消耗根本不值一提。

而对于array.length.这就是一个变量访问,这个是肯定的。不会有什么消耗(即使是在j2me中)


list.size()也就多了一条指令的开销,当然,invokeinterface或者invokevirutal会慢一些,这是肯定,通常情况下根本不需要考虑这些。我没搞过j2me,不敢妄下结论,也许j2me的jvm比较不同。


引用
invokeinterface或者invokevirutal会慢一些


是否有参考资料?那么方法内联是不是可以完全忽略这个问题。
0 请登录后投票
   发表时间:2010-07-28  
这也是为了养成一个良好的编程习惯,如果习惯了在循环里面声明变量,那将来会不会不加思索就在循环里 new 一个对象出来呢!
0 请登录后投票
   发表时间:2010-07-29  
在jdk1.4以上版本会对代码进行优化的,就这点问题不至于骂人把,你可以问问代码评审的那个人,你写的代码敢保证性能最高么。。
0 请登录后投票
   发表时间:2010-07-29  
adyfang 写道
这也是为了养成一个良好的编程习惯,如果习惯了在循环里面声明变量,那将来会不会不加思索就在循环里 new 一个对象出来呢!


循环里面new对象怎么了,你还担心GC回收不了?除非你new的大对象并且循环多次,或者将new出来东西加入某个集合持有,不然根本不会有问题。这种以讹传讹的事情还是少说点。
0 请登录后投票
   发表时间:2010-07-29  
你的代码没错,你有错,错在不知道你的代码没错。
0 请登录后投票
   发表时间:2010-07-29  
shansun123 写道
magicbu 写道
这段代码最大的问题不是在这一句吗
i<arr.len
长度应该首先被变量保存,避免重复计算~

同意。。但是也视情况而定吧 如果在代码段里对数组做了增删操作的话 还是用arr.len比较好 呵呵。。


如果改变正在循环的数组(或集合)的大小,在C#中肯定抛导常.java不会吗?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics