`
gao_20022002
  • 浏览: 160231 次
  • 性别: 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;
}  
}

相关推荐

    程序员面试刷题的书哪个好-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)之后的第三代半导体材料,具有高击穿电场、高饱和电子速度、高热导率、高电子密度、高迁移率等特点,可实现高压、高温、...

    c语言编写单片机技巧

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

    ARM和X86功耗差别的深层原因探讨

    如果大家都做同样的事情,完成一个大功能,精简指令集需要指令较多,而复杂指令集需要指令少,加起来到底谁耗电多呢。还有,现在处理器普遍采用微指令,大的指令会被拆分成更小的指令,以达到更高的流水线效率.简单...

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

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

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

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

    决策树算法及实现

    在监督学习中,面对样本中复杂多样的特征,选取什么样的策略可以实现较高的学习效率和较好的分类效果一直是科学家们探索的目标。那么,树这种结构到底可以如何用于机器学习中呢?我们先从一个游戏开始。我们应该都玩...

    JAVA自学之路

    我一直不认为一个课程提供了很多很多的细节就是优秀的价值高的课程了,掌握必要的细节,这个不含糊,至于其他,或者通过视频给出(这样可以给出更多的细节,但是不占上课时间,课上只讲重要的、必要的细节知识),...

    asp.net知识库

    我是谁?[C#] 表达式计算引擎 正式发布表达式计算引擎WfcExp V0.9(附源码) 运算表达式类的原理及其实现 #实现的18位身份证格式验证算法 身份证15To18 的算法(C#) 一组 正则表达式 静态构造函数 忽略大小写Replace...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    Java编程老鸟潜心写作,奉献高效率的Java学习心得 完全站在没有编程经验读者的角度,手把手教会读者学习Java 配16小时多媒体教学视频,高效、直观 一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让...

    威盾VirtualWall防盗链专家 v3.0.7.1046

    软件特点: 采用 C++ 纯 SDK 编写,运行效率极高。在每秒 50兆比特数据传输的大型服务器上运行良好,占用 CPU 很少。 不写注册表,不捆绑任何插件,纯绿色无污染软件。 超强安全防护:彻底防 SQL 注入攻击;彻底防止...

Global site tag (gtag.js) - Google Analytics