`
gao_20022002
  • 浏览: 164878 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

到底谁的效率高??

    博客分类:
  • Java
阅读更多

在写代码的时候,常常使用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??

2
2
分享到:
评论
4 楼 dennis_zane 2008-11-17  
public static void test2(){ 
         boolean b = true; 
         b = (b?false:true); 
}

你自己多写了一个b==true罢了。改成上面那样,两者编译后的字节码指令是完全相同的。

3 楼 doylecnn 2008-11-17  
关注
等待解答
2 楼 gao_20022002 2008-11-17  
doylecnn 写道
   1. public class Test3{   
   2. public static void main(String[] argv){   
   3. boolean b = true;   
   4. b=false; 
   5. }   
   6. } 

不是程序执行结果的问题,使他对这些语句的编译问题。
1 楼 doylecnn 2008-11-17  
public class Test3{  
public static void main(String[] argv){  
boolean b = true;  
b=false;
}  
}

相关推荐

    关键假设表调整与交流精粹(2019_年_10_月):专项债最终投向何处?增值税减税到底谁受益?_申万宏源-43页.pdf

    增值税减税到底谁受益?》对这些热点问题进行了深入的分析与探讨。 首先,专项债作为地方政府债务的重要组成部分,其资金的用途和效率直接关系到地方经济的发展质量和未来债务的可持续性。在2019年,专项债的投向...

    程序员面试刷题的书哪个好-New-Blood:图像处理新血液

    如果写一个空循环,那种循环效率高? 你能深刻理解字符编码是怎么的吗? char 与 int 的有什么关系? 数组的初始化有哪些方式? 数组的存储原理是什么? 二维数组的有几种操作方式?。 数组名到底是什么? 字符串...

    你必须知道的495个C语言问题

    5.9 如果NULL和0作为空指针常量是等价的,那我到底该用哪一个呢? 5.10但是如果NULL的值改变了,比如在使用非零内部空指针的机器上,用NULL(而不是0) 不是更好吗? 5.11 我曾经使用过一个编译器,不使用NULL就...

    《你必须知道的495个C语言问题》

    5.9 如果NULL和0作为空指针常量是等价的,那我到底该用哪一个呢? 58 5.10 但是如果NULL的值改变了,比如在使用非零内部空指针的机器上,用NULL(而不是0) 不是更好吗? 58  5.11 我曾经使用过一个编译器,不...

    C语言FAQ 常见问题列表

    o 2.5 关键字 auto 到底有什么用途? o 2.6 我似乎不能成功定义一个链表。我试过 typedef struct { char *item; NODEPTR next; } *NODEPTR; 但是编译器报了错误信息。难道在C语言中一个结构不能包含指向自己的指针...

    asp程序执行数据库的效率提升建议

    很多网友非常不喜欢用ASP来编程,他们总是抱怨说ASP程序太慢,效率太低。...其实不能从 “认为” 这个角度来看问题 ,而应该从实际中看问题,...所以今天我们不会比较这三种WEB语言到底谁好,谁坏,而是讲解如何提高程

    你必须知道的495个C语言问题(PDF)

    5.7 如果NULL 和0 作为空指针常数是等价的, 那我到底该用哪一个 呢? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 5.8 但是如果NULL 的值改变了, 比如在使用非零内部空指针的机器 上, ...

    淘宝技术这十年

    而技术的创新和业务的创新到底又是谁推动了谁?淘宝文件系统——TFS淘宝KV缓存系统——Tair第5章 分布式电子商务操作系统在飞速发展的背后,隐患已经埋下。在技术架构的制约下,团队协作越来越艰难,代码越来越臃肿...

    宽带隙半导体与硅集成电路到底谁比较优秀

    以氮化镓(GaN)、碳化硅(SiC)和氧化锌(ZnO)为代表的宽禁带半导体是继硅和砷化镓(GaAs)之后的第三代半导体材料,具有高击穿电场、高饱和电子速度、高热导率、高电子密度、高迁移率等特点,可实现高压、高温、...

    中国领导者十年领导力图鉴DDI2021(54页).pdf

    该报告旨在回答以下几个问题:到底是谁在引领中国企业的发展?中国企业不同层级的领导者为未来做好准备了吗?向上发展,领导力的瓶颈在哪里?不同行业如何更好地应对领导力挑战?什么样的发展举措是最为有效与高回报...

    c语言编写单片机技巧

    其主要优点是占用资源少、程序执行效率高。但是不同的CPU,其汇编语言可能有所差异,所以不易移植。 C语言是一种结构化的高级语言。其优点是可读性好,移植容易,是普遍使用的一种计算机语言。缺点是占用资源较多...

    专题资料(2021-2022年)《第一次做人力资源经理》第8章沟通与企业文化.doc

    3. **团队建设**:“到底是谁的错?”提示我们在团队建设中,需要明确角色定位,理解每个人的能力和需求。人力资源部应协助各部门明确团队目标,培养团队精神,解决团队内部的分歧,以增强团队凝聚力。 4. **领导...

    7、一次To B 项目的需求分析总结.docx

    2. **项目经理:** 在一些专注于技术解决方案的公司中,项目经理可能会承担起需求分析的责任,特别是那些对技术实现细节有更高要求的项目。 3. **需求分析师:** 对于特定领域的深入需求分析,如数据需求分析、算法...

    彻底防盗链&搜索引擎优化

    运行效率极高。 超强文件防盗功能:保护指定扩展名文件、保护指定整个目录下文件、也可以设置相应目录白名单、友情站点。 超强流媒体防盗功能:flash/图片/多媒体文件,您都可以安心地将这些文件放置在您的网站上...

    彻底防盗链&搜索引擎优化软件VirtualWall v2.1.7.1038

    特点与功能: 采用 C++ 纯 SDK 编写,运行效率极高。 不写注册表,不写启动项,纯绿色无污染软件。 超强文件防盗功能,保护指定扩展名文件、保护指定整个目录下文件、也可以设置相应目录白名单、友情站点。 超强流...

    竞争与销售讲义.doc

    同时,流通速度也成为关键,谁能更快地将产品送达市场,谁就能抢占先机,赢得竞争优势。 3. 价值链竞争 企业应关注整个价值链,从研发、生产、分销到售后服务,每个环节都可能是决定胜负的关键。优化价值链,提高...

    合集6、互联网行业案例.docx

    - **GAPS5.0 特点:** 恒生GAPS5.0是一款专注于金融行业的高性能、高可用的分布式平台,特别适合构建金融行业的中台系统。 - **技术创新点:** 介绍了GAPS5.0在安全性、稳定性等方面的创新技术,展示了其在中台架构...

Global site tag (gtag.js) - Google Analytics