我有这个代码:
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);
}
有了这个输出/s:
测试一:
427
300
测试 2:
533
300
测试 3:
431
398
根据我的测试场景,为什么 int b = 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10 + 10;
执行得比int a = 10 + 10;
?
最佳答案
众所周知,微基准测试很难做到正确,尤其是在 Java 等“智能”语言中,编译器和 Hotspot 可以在其中进行大量优化。您几乎可以肯定没有在测试您认为正在测试的东西。阅读 Anatomy of a Flawed Microbenchmark有关更多详细信息和示例(现在这是一篇相当古老的文章,但原则仍然有效)。
在这种特殊情况下,我可以立即看出至少三个问题:
- 代码根本不会执行任何加法运算,因为编译器会为变量分配编译时常量值。 (也就是说,就好像您的代码读取了
int a = 20;
和int b = 120;
) nanoTime
的粒度在大多数系统上都相当高。这与来自操作系统的负载相结合,将意味着您在测量中的实验误差远大于结果本身的幅度。- 即使发生了添加,您也没有“预热”VM;由于这个原因,通常无论您将哪个操作放在第二位都会显得更快。
可能还潜伏着更多的潜在危险。
这个故事的寓意是在真实世界条件下测试您的代码,看看它的行为如何。孤立地测试小块代码并假设整体性能将是这些部分的总和是不准确的。
关于Java - 执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16894169/