Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java空检查性能_Java_Performance_Performance Testing - Fatal编程技术网

Java空检查性能

Java空检查性能,java,performance,performance-testing,Java,Performance,Performance Testing,我想知道在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();

我想知道在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);
  }
}
令人惊讶的是,至少对我来说,完成NOFN呼叫总是需要更多的时间。我期望的结果与此相反,因为它会导致使用堆栈进行方法调用

这就是输出:很明显,每次都会改变,但总是伴随着更高的nofn调用

截止时间:583

预计时间:463


为什么会出现这种情况?

您看到的结果可能是由于在测试和测量之前没有引入适当的预热,而是先运行noFnCalls

我明白了:

withFnCalls ellapsed time: 444
noFnCalls ellapsed time: 471
withFnCalls ellapsed time: 334
noFnCalls ellapsed time: 331
withFnCalls ellapsed time: 330
noFnCalls ellapsed time: 325
withFnCalls ellapsed time: 331
noFnCalls ellapsed time: 326
withFnCalls ellapsed time: 326
noFnCalls ellapsed time: 328
使用

如果我增加到1000000000L迭代次数。这是由Oracle使用Java 9 64位服务器jvm(build 9+181)完成的,该jvm在Windows 10上运行,机器具有Intel i5-2600 cpu

正如其他人所说,微观基准测试很难,很多不同的事情都会影响结果。你不应该对这样的测试妄下结论。这种测试并不能告诉我们太多的东西——任何差异都很容易在彼此非常接近的噪声测量代码中丢失


关于java中的微基准测试的强制性推荐线程:。

您看到的结果可能是由于首先运行noFnCalls,而没有在测试和测量之前引入适当的预热

我明白了:

withFnCalls ellapsed time: 444
noFnCalls ellapsed time: 471
withFnCalls ellapsed time: 334
noFnCalls ellapsed time: 331
withFnCalls ellapsed time: 330
noFnCalls ellapsed time: 325
withFnCalls ellapsed time: 331
noFnCalls ellapsed time: 326
withFnCalls ellapsed time: 326
noFnCalls ellapsed time: 328
使用

如果我增加到1000000000L迭代次数。这是由Oracle使用Java 9 64位服务器jvm(build 9+181)完成的,该jvm在Windows 10上运行,机器具有Intel i5-2600 cpu

正如其他人所说,微观基准测试很难,很多不同的事情都会影响结果。你不应该对这样的测试妄下结论。这种测试并不能告诉我们太多的东西——任何差异都很容易在彼此非常接近的噪声测量代码中丢失


关于java中的微基准测试的强制性推荐线程:。

用java编写一个正确的微基准是很棘手的。你的系统预热了吗?如果以相反的顺序运行测试,结果是否相同?请参阅:实际上,使用这两种测试中的哪一种并不重要,因为性能增益最小。但是,ObjectsisNull被用作谓词。此测试无效,t未使用且为常量。在Java中编写正确的微基准非常棘手。你的系统预热了吗?如果以相反的顺序运行测试,结果是否相同?请参阅:实际上,使用这两种测试中的哪一种并不重要,因为性能增益最小。但是,ObjectsisNull将用作谓词。此测试无效,t未使用且为常量。Windows 10、Linux/Debian和FreeBSD上的Java 1.8.0 x64也有相同的结果。Windows 10、Linux/Debian和FreeBSD上的Java 1.8.0 x64也有相同的结果。
withFnCalls ellapsed time: 3618
noFnCalls ellapsed time: 3361
withFnCalls ellapsed time: 3445
noFnCalls ellapsed time: 3278
withFnCalls ellapsed time: 3350
noFnCalls ellapsed time: 3292
withFnCalls ellapsed time: 3309
noFnCalls ellapsed time: 3262
withFnCalls ellapsed time: 3293
noFnCalls ellapsed time: 3261