基本(算术)操作及其对 JVM 和 CPU 的依赖
Basic (arithmetic) operations and their dependence on JVM and CPU
在Java我想测量
的时间
- 1000 次整数比较(“<”运算符),
- 1000 次整数加法 (a+b
对于不同的 a 和 b),
- 又是一个简单的操作。
我知道我可以通过以下方式完成:
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
在Java我想测量
的时间- 1000 次整数比较(“<”运算符),
- 1000 次整数加法 (a+b 对于不同的 a 和 b),
- 又是一个简单的操作。
我知道我可以通过以下方式完成:
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