当前位置: 首页 > 面试题库 >

'…!= null'或'null!=…'最佳性能?

单嘉泽
2023-03-14
问题内容

我写了两种方法检查那里的表现

 public class Test1 {

 private String value;

 public void notNull(){
  if( value != null) {
    //do something
  }
}

public void nullNot(){
 if( null != value) {
  //do something
 }
}

}

并在编译后检查它的字节码

public void notNull();
Code:
Stack=1, Locals=1, Args_size=1
0: aload_0
1: getfield #2; //Field value:Ljava/lang/String;
4: ifnull 7
7: return
LineNumberTable: 
line 6: 0
line 9: 7

StackMapTable: number_of_entries = 1
frame_type = 7 /* same */


public void nullNot();
Code:
Stack=2, Locals=1, Args_size=1
0: aconst_null
1: aload_0
2: getfield #2; //Field value:Ljava/lang/String;
5: if_acmpeq 8
8: return
LineNumberTable: 
line 12: 0
line 15: 8

StackMapTable: number_of_entries = 1
frame_type = 8 /* same */


}

在这里,两个操作码用于实现if条件:在第一种情况下,它使用ifnull-检查栈顶值是否为null-;在第二种情况下,它使用if_acmpeq-
检查栈顶值是否相等-

那么,这会对性能产生影响吗?(这将帮助我证明null的第一个实现在性能方面以及可读性方面都不错:))


问题答案:

比较生成的字节码几乎没有意义,因为大多数优化是在运行时使用JIT编译器进行的。我猜想在这种情况下,任何一个表达式都同样快。如果有任何差异,则可以忽略不计。

这不是您需要担心的事情。寻找大图优化。



 类似资料:
  • 问题内容: 我听到有人比检查更好 例如: 有什么原因还是这是另一个神话?感谢帮助。 问题答案: 这可能是从C那里学来的一种习惯,可以避免这种错字(单打而不是双打): 将常量放在左侧的约定在Java中并不是真正有用的,因为Java要求将表达式中的表达式if计算为一个值,因此,除非常量为,否则将以两种方式放置都会产生编译错误论点。(如果是布尔值,则==无论如何都不应该使用…)

  • 问题内容: 考虑以下两行代码 和 在性能上,以上两个语句有什么区别吗?我见过很多人使用后者,当被问及他们说这是最佳实践时,没有充分的理由。 问题答案: 没有不同。 第二个原因仅仅是因为C / C ++程序员总是执行分配而不是比较。 例如 而java编译器会生成编译错误。 因此,由于可读性强,我个人更喜欢第一个,人们倾向于从左到右阅读,而不是。

  • 问题内容: 在使用hibernate保存父/子对象时遇到麻烦。任何想法将不胜感激。 hibernate映射: InvoiceManager.java 发票.java InvoiceItem.java 问题答案: 由于在 多对一 映射中,每个对象都必须具有附件。 __ 因此,基本思想是您需要在代码中建立该显式关系。有很多方法可以做到这一点。在您的课堂上,我看到了一个方法。我看不到方法。设置项目时,需

  • 我对BDD与Cucumber有关的最佳实践有两个疑问。 我有一个页面自动用户注册。 我想能够提交测试通过测试1个选项选择,2个选项,3个选项,...,所有选项几次。但我只想做,如果有一个精干的方法来做这件事。 换句话说:在场景大纲示例中,我可以在这种情况下传递空值吗?

  • 问题内容: 我在一个网站上有一个表格,该表格有很多不同的领域。一些字段是可选的,而某些字段是必填的。在我的数据库中,我有一个包含所有这些值的表,是否将NULL值或空字符串插入用户未放置任何数据的DB列中是更好的做法? 问题答案: 通过使用,您可以区分“不输入数据”和“不输入数据”。 更多区别: 一个的就是,一个空字符串的是。 s在空字符串之前排序。 将计算空字符串,但不计算s 您可以使用绑定变量搜

  • 问题内容: 我希望在可为空的列上搜索数据库表。有时,我要搜索的值本身就是NULL。由于Null等于零,甚至NULL,所以说 将失败。现在我不得不求助于 有没有更简单的说法呢? (如果重要的话,我正在使用Oracle) 问题答案: 您可以做IsNull或NVL东西,但这只会使引擎做更多的工作。您将调用函数进行列转换,然后必须将结果进行比较。 用你所拥有的