Java - 执行时间

标签 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);

}

有了这个输出/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/

相关文章:

hibernate - 如何在 hibernate 中执行日期操作

php - 在 PHP 中本地化当前时间

带有 C++ bool 函数的 C# DllImport 未正确返回

google-cloud-platform - 如何从 bq 命令行工具调用 BigQuery 过程?

javascript - 如何在 html anchor 上调用已有的 jquery 函数?

java - 如何禁用拓扑一段时间,然后在该时间段结束时自动启动它

java - Spring - Aspectj 未应用于混淆的(YGuard)二进制文件(jar)

java - struts.action.excludePattern 不工作

java - Branch vs Tag.. 来自 SVN 世界

unix - NTPD:使用不受限制的端口进行通信