java

位置:IT落伍者 >> java >> 浏览文章

两段Java程序的效率


发布日期:2020年12月27日
 
两段Java程序的效率
//代码

public class Obj {

private int i;

public int getI() {

return i;

}

public void setI(int i) {

thisi = i;

}

}

//代码

List result = new ArrayList()

Obj o =null; ※

for(int i=;i<;i++){

o =new Obj()

osetI(i)

resultadd(o)

}

//代码

List result = new ArrayList()

for(int i=;i<;i++){

Obj o =new Obj()

osetI(i)

resultadd(o)

}

很多人的结论如下

)代码比代码的效率高

)代码的可维护性不如代码因为变量作用域扩大了

其实结论)是错误的

段代码反汇编及说明

: new #; //new ArrayList()

: dup //将新创建的ArrayList的引用复制并压入栈

: invokespecial #; //编译器插入的ArrayList初始化方法ArrayList<init>

: astore_ //局部变量赋值result = new ArrayList()

: aconst_null //局部变量赋值o = null

: astore_

: iconst_ //局部变量赋值i =

: istore_

: iload_ //比较i和

: bipush

: if_icmpge //如果i >= 函数返回

: new #; //new Obj()

: dup //将新创建的Obj的引用复制并压入栈

: invokespecial #; //编译器插入的Obj初始化方法 Method <init>

: astore_ //局部变量赋值o = new Obj()

: aload_ //准备调用参数栈取出局部变量的引用并压栈 o

: iload_ //准备调用参数栈取出局部变量的值并压栈i

: invokevirtual #; //方法调用oset(i)

: aload_ //取出局部变量的引用并压栈 result

: aload_ //取出局部变量的引用并压栈 o

: invokeinterface # ; //调用Listadd()方法 resultadd(o)

: pop

: iinc //i++

: goto //回到for循环头

: return //函数返回

段代码反汇编及说明

: new #; //new ArrayList()

: dup /将新创建的ArrayList的引用复制并压入栈

: invokespecial #; //编译器插入的ArrayList初始化方法ArrayList<init>

: astore_ /局部变量赋值result = new ArrayList()

: iconst_ //局部变量赋值i =

: istore_

: iload_ //比较i和

: bipush

: if_icmpge //如果i >= 函数返回

: new #; //new Obj()

: dup //将新创建的Obj的引用复制并压入栈

: invokespecial #; //编译器插入的Obj初始化方法 Method <init>

: astore_ //局部变量赋值o = new Obj()

: aload_ //准备调用参数栈取出局部变量的引用并压栈 o

: iload_ //准备调用参数栈取出局部变量的值并压栈i

: invokevirtual #; //方法调用oset(i)

: aload_ //取出局部变量的引用并压栈 result

: aload_ //取出局部变量的引用并压栈 o

: invokeinterface # ; //调用Listadd()方法 resultadd(o)

: pop

: iinc //i++

: goto //回到for循环头

: return //函数返回

小结

代码效率显然不如代码红色那两行是多余的

代码可维护性比较差冯勇强前面有说明

代码与代码的差异除了多了那两句就是局部变量的索引顺序不同循环体的反汇编也是完全一样的所以代码各方面都不如代码一般推荐的写法这与大多数人日常编码习惯是一致的

上一篇:驾驭“野马”-- 探索Java SE 6的一些新特性

下一篇:Java web start入门