到底谁的效率高??

在写代码的时候,常常使用if-else显得很麻烦,对于简单的赋值操作,我们可以使用三目运算符,但是与if-else比较的效率呢,不知道有没有人关注过。

 

现在来看看下面的测试:

public class Test1{
  public static void main(String[] argv){
      boolean b = true;
      if(b){
         b = false;
      }else{
         b = true;
      }
  }
}
 
public class Test2{
	public static void main(String[] argv){
		boolean b = true;
		b = (b==true?false:true);
	}
}

 进行javap分析:

D:>javap  -s Test1
Compiled from "Test1.java"
public class Test1 extends java.lang.Object{
public Test1();
  Signature: ()V
public static void main(java.lang.String[]);
  Signature: ([Ljava/lang/String;)V
}


D:>javap  -s Test2
Compiled from "Test2.java"
public class Test2 extends java.lang.Object{
public Test2();
  Signature: ()V
public static void main(java.lang.String[]);
  Signature: ([Ljava/lang/String;)V
public class Test2{
	public static void main(String[] argv){
		boolean b = true;
		b = (b ? false : true);
	}
} }


D:>javap  -c Test1
Compiled from "Test1.java"
public class Test1 extends java.lang.Object{
public Test1();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   iconst_1
   1:   istore_1
   2:   iload_1
   3:   ifeq



 11
   6:   iconst_0
   7:   istore_1
   8:   goto    13
   11:  iconst_1
   12:  istore_1
   13:  return

}


D:>javap  -c Test2
Compiled from "Test2.java"
public class Test2 extends java.lang.Object{
public Test2();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   iconst_1
   1:   istore_1
   2:   iload_1
   3:   iconst_1
   4:   if_icmpne



 11
   7:   iconst_0
   8:   goto    12
   11:  iconst_1
   12:  istore_1
   13:  return

}

 可见,进行的存储结构都相同,并且执行的指令条数也相同,只是执行过程中处理出现了一条语句的差异:

ifq还是if_icmpne,对于这两个,应该决定着效率问题,但是谁的更好呢?

 

增加:

根据下面回复的问题,确实有此种情况出现:

将Test2代码变化为:

public class Test2{
	public static void main(String[] argv){
		boolean b = true;
		b = (b ? false : true);
	}
}

 则相应的javap分析变为:

D:>javap -c Test2
Compiled from "Test2.java"
public class Test2 extends java.lang.Object{
public Test2();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   iconst_1
   1:   istore_1
   2:   iload_1
   3:   ifeq    10
   6:   iconst_0
   7:   goto    11
   10:  iconst_1
   11:  istore_1
   12:  return

}

 与Test1的比较得出:

D:>javap -c Test1
Compiled from "Test1.java"
public class Test1 extends java.lang.Object{
public Test1();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   iconst_1
   1:   istore_1
   2:   iload_1
   3:   ifeq    11
   6:   iconst_0
   7:   istore_1
   8:   goto    13
   11:  iconst_1
   12:  istore_1
   13:  return

}

 解析过程中少解析了一条指令,但是执行的代码条数相同。

也就是说,这样的写法不会提高任何效率,但是Test2.java代码相对简洁一些。

 

查看了一下class文件,分别为315字节(Test1.class)和307字节(Test2.class),去除命名差异引起的字节变化,大概也就是多出来的那条指令所引起的。

 

OK??

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值