'... != null' 或 'null != ...' 哪个性能更好?(涉及IT技术)

53

我写了两个方法来检查它们的性能。

 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——检查堆栈中的前两个值是否相等。

所以,这会对性能产生影响吗? (这将帮助我证明第一种空值实现在性能和可读性方面都很好 :))


4
Polygene的回答是你应该听取的。但如果你真的认为这种差异很重要,那就分别运行每个版本数十亿次,看看是否有任何可测量的差异。然后回来告诉我们结果。 - Peter Recore
为什么这很重要,你的程序只有三行长,以至于那个孤独的if语句运行得快慢如此重要吗? - mP.
7
顺便说一下,我想证明将开括号放在条件语句同一行比其他大括号风格更具性能优势。 - Ben Zotto
18
我会说OP需要得到表扬,因为他付出了努力,深入研究了字节码等。在得到适当的指导后,这种决心将对OP有好处。 - polygenelubricants
16个回答

1

在编程过程中,你可以忽略这些微小的优化细节。


1

正如您所看到的,性能差异非常小。不要担心小事情,更好地关注算法。显然,可读性也是一个因素。


0
在Java 8中,Objects类引入了两个额外的方法:Objects#nonNullObjects#isNull,您可以使用它们来替换null检查。有趣的是,它们都首先使用对象:
public static boolean isNull(Object obj) {
    return obj == null;
}

public static boolean nonNull(Object obj) {
    return obj != null;
}

相应地,我猜这意味着这是推荐的方式(至少核心jdk开发人员使用了这种方法) Objects源代码


0

我会使用“新”的Java 8功能,以下是我的几个示例:

import java.util.Optional;

public class SillyExample {

public void processWithValidation(final String sampleStringParameter){
    final String sampleString = Optional.ofNullable(sampleStringParameter).orElseThrow(() -> new IllegalArgumentException("String must not be null"));

    //Do what you want with sampleString
}


public void processIfPressent(final String sampleStringParameter){
    Optional.ofNullable(sampleStringParameter).ifPresent(sampleString -> {

        //Do what you want with sampleString

    });

}

public void processIfPressentWithFilter(final String sampleStringParameter){
    Optional.ofNullable(sampleStringParameter).filter("hello"::equalsIgnoreCase).ifPresent(sampleString -> {

        //Do what you want with sampleString

    });

}

}


0

我更喜欢使用null != object,因为它清晰地表明这只是用于空值检查。


-3

字节码只是源代码的简单翻译。


这完全取决于您使用的编译器。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接