基本(算术)操作及其对 JVM 和 CPU 的依赖

Basic (arithmetic) operations and their dependence on JVM and CPU

在Java我想测量

的时间
  1. 1000 次整数比较(“<”运算符),
  2. 1000 次整数加法 (a+b 对于不同的 a 和 b),
  3. 又是一个简单的操作。

我知道我可以通过以下方式完成:

Random rand = new Random();
long elapsedTime = 0;
for (int i = 0; i < 1000; i++) {
    int a = Integer.MIN_VALUE + rand.nextInt(Integer.MAX_VALUE);
    int b = Integer.MIN_VALUE + rand.nextInt(Integer.MAX_VALUE);

    long start = System.currentTimeMillis();
    if (a < b) {}
    long stop = System.currentTimeMillis();
    elapsedTime += (start - stop);
}
System.out.println(elapsedTime);

我知道这个问题可能看起来不太清楚。

这些值如何取决于我的处理器(即这些操作的时间与我的处理器之间的关系)和 JVM?有什么建议吗?

我正在寻找可以理解的读物...

How those values depend on my processor (i.e. relation between time for those operations and my processor) and JVM? Any suggestions?

它不依赖于您的处理器,至少不直接依赖于它。

通常,当您 运行 代码足够时,它会将其编译为本机代码。当它执行此操作时,它会删除不执行任何操作的代码,因此您在这里要做的是测量执行 System.currentMillis() 所需的时间,通常约为 0.00003 毫秒。这意味着您将有 99.997% 的时间得到 0 并且很少看到 1。

我说的是正常情况,但在这种情况下,您的代码将不会编译为本机代码,因为默认阈值是 10,000 次迭代。 IE。您将测试解释器执行字节代码需要多长时间。这要慢得多,但仍然只有几分之一毫秒。也就是说,你有更高的机会看到 1 但仍然不太可能。

如果您想了解更多关于 Java 中的低级基准测试,我建议您阅读 JMH and the Author's blog http://shipilev.net/

如果您想查看从 Java 代码生成的机器代码,我建议您尝试 JITWatch