【发布时间】:2018-06-08 06:58:14
【问题描述】:
我想知道在 java 中通过直接比较或使用 Objects.isNull() 方法检查对象是否为 null 是否有任何显着差异。
public class Test {
public final static Long ITERATIONS = 100000000L;
@Test
public void noFnCalls() {
balong startTime = System.currentTimeMillis();
Object x = new Object();
Long i;
for (i = 0L; i < ITERATIONS; i++) {
boolean t = x == null;
}
long estimatedTime = System.currentTimeMillis() - startTime;
System.out.println("noFnCalls ellapsed time: " + estimatedTime);
}
@Test
public void withFnCalls() {
long startTime = System.currentTimeMillis();
Object x = new Object();
Long i;
for (i = 0L; i < ITERATIONS; i++) {
boolean t = Objects.isNull(x);
}
long estimatedTime = System.currentTimeMillis() - startTime;
System.out.println("withFnCalls ellapsed time: " + estimatedTime);
}
}
令人惊讶的是,至少对我来说,完成“noFnCalls”总是需要更多时间。我期待的结果几乎相反,因为它会导致使用堆栈的方法调用。
这是输出:(显然,每次都会更改,但总是“noFnCalls”更高)
noFnCalls 已用时间:583
withFnCalls 耗时:463
为什么会这样?
【问题讨论】:
-
在 Java 中编写正确的微基准测试非常棘手。你有没有预热你的系统?如果您以相反的顺序运行测试,您的结果是否相同?
-
实际上,使用两者中的哪一个并不重要,因为性能增益是最小的。但是,Objects#isNull 旨在用作谓词。
-
此测试无效,
t未使用且不变。
标签: java performance performance-testing