迄今为止发布的任何 Java 版本之间是否存在性能差异?
foo != null
和
null != foo
?
我个人认为上述两种形式的对象空值检查的行为没有任何变化,但不确定哪一种表现更好。我知道差异会非常小,如果有的话,但想知道为什么有人以这种方式编写所有代码。
迄今为止发布的任何 Java 版本之间是否存在性能差异?
foo != null
和
null != foo
?
我个人认为上述两种形式的对象空值检查的行为没有任何变化,但不确定哪一种表现更好。我知道差异会非常小,如果有的话,但想知道为什么有人以这种方式编写所有代码。
应该没有性能差异,但形式可读性 foo != null 更好。因为通常在左侧,我们将要比较的值与右侧的值进行比较。通常我们会将我们的对象(如 foo)与 null 进行比较。
这来自旧的 C 时代。它以 foo == null (null == foo) 开头。
在 c 中语法是有效的(编译器没有抱怨):
if (foo = null) {
}
为了防止这种微妙的错误语法开始使用:
if (null == foo) {
}
因为 null 是常量 this if (null = foo) { }
变成语法错误。
在java中,只有一种情况很重要:
boolean someBoolean;
if (someBoolean = true) {
}
是运行时错误,但可以编译
这个
boolean someBoolean;
if (true = someBoolean) {
}
是编译错误。
没有性能问题,在某些情况下只有错误预防。
平等是对称的。所以顺序在语义上并不重要。
传统风格说你把你要检查的东西放在第一位,常数放在最后。这遵循(至少许多欧洲)语言形式,例如“x 为空吗?” 不是“是空 x?”。
在历史上的某一时刻,人们曾经用if (NULL == x)
C 编写。这是为了让编译器if (NULL = x)
通过说“你不能分配给一个常量”来捕获一个意外的语法错误。标准代码质量工具现在可以识别这些类型的错误,因此这种做法现在已经过时了。
时尚是关于尤达风格的。这只是个人喜好的问题。
“尤达条件”——使用 if (constant == variable) 而不是 if (variable == constant),例如 if (4 == foo)。因为这就像说“如果天空是蓝色的”或“如果男人是高的”。
不,这两种形式没有区别。
不管怎样,都有以下指令——加载foo的值,与0(null)比较,读取比较结果。
现在,如果它是 equals() 方法,那将是不同的:)
public class Stack
{
public static void main(String[] args)
{
Object obj0 = null;
Object obj1 = new Object();
long start;
long end;
double difference;
double differenceAvg = 0;
for (int j = 0; j < 100; j++)
{
start = System.nanoTime();
for (int i = 0; i < 1000000000; i++)
if (obj0 == null);
end = System.nanoTime();
difference = end - start;
differenceAvg +=difference;
}
System.out.println(differenceAvg/100);
differenceAvg = 0;
for (int j = 0; j < 100; j++)
{
start = System.nanoTime();
for (int i = 0; i < 1000000000; i++)
if (null == obj0);
end = System.nanoTime();
difference = end - start;
differenceAvg +=difference;
}
System.out.println(differenceAvg/100);
differenceAvg = 0;
for (int j = 0; j < 100; j++)
{
start = System.nanoTime();
for (int i = 0; i < 1000000000; i++)
if (obj1 == null);
end = System.nanoTime();
difference = end - start;
differenceAvg +=difference;
}
System.out.println(differenceAvg/100);
differenceAvg = 0;
for (int j = 0; j < 100; j++)
{
start = System.nanoTime();
for (int i = 0; i < 1000000000; i++)
if (null == obj1);
end = System.nanoTime();
difference = end - start;
differenceAvg +=difference;
}
System.out.println(differenceAvg/100);
}
}
在Object
初始化的情况下,什么都没有收集到;但是,当Object
是时null
,几乎在每个平均情况下,obj0 == null
都比 快null == obj0
。我进行了 21 次额外的处决,其中 20 次是这种情况。