Java - 执行时间

Mic*_*dan 1 java time invoke execution

我有这个代码:

public static void main(String[] args) {

    long f = System.nanoTime();

    int a = 10 + 10;

    long s =System.nanoTime();

    System.out.println(s - f);

    long g = System.nanoTime();

    int b = 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10;

    long h =System.nanoTime();

    System.out.println(h - g);

}
Run Code Online (Sandbox Code Playgroud)

使用此输出/ s:
测试1:

427
300
Run Code Online (Sandbox Code Playgroud)

测试2:

533
300
Run Code Online (Sandbox Code Playgroud)

测试3:

431
398
Run Code Online (Sandbox Code Playgroud)

根据我的测试场景,为什么线int b = 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10;执行速度比int a = 10 + 10;

And*_*yle 5

众所周知,微型计算机很难做到正确,特别是在Java等"智能"语言中,编译器和Hotspot可以进行大量的优化.你几乎肯定没有测试你认为你正在测试的东西.阅读一篇有缺陷的Microbenchmark解剖图,了解更多细节和示例(现在这篇文章相当古老,但原则同以往一样有效).

在这种特殊情况下,我至少可以看到三个问题:

  • 代码根本不会执行任何添加,因为编译器会将变量分配给它们的编译时常量值.(即它是因为如果你的代码读取int a = 20;int b = 120;)
  • nanoTime在大多数系统上,粒度非常高.这与OS的负载相结合,意味着您在测量中的实验误差远大于结果本身的大小.
  • 即使正在进行添加,您也没有"预热"VM; 由于这个原因,通常你把第二个操作放得更快.

潜伏着潜在的潜在危险.

这个故事的寓意是在真实世界的条件下测试你的代码,看看它的行为方式.单独测试小块代码并且假设整体性能将是这些部分的总和绝不是准确的.