在Java中我想测量
的时间我知道我可以通过以下方式实现:
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?有什么建议吗?
我正在寻找可以理解的读物......
答案 0 :(得分:2)
这些值如何依赖于我的处理器(即那些操作的时间与我的处理器之间的关系)和JVM?有什么建议吗?
它不依赖于您的处理器,至少不是直接依赖。
通常,当您运行足够的代码时,它会将其编译为本机代码。当它执行此操作时,它会删除不执行任何操作的代码,因此您将在此处执行的操作是测量执行System.currentMillis()
所需的时间,通常为0.00003 ms。这意味着您将获得0
99.997%的时间并且很少看到1。
我说正常,但在这种情况下,您的代码将不会被编译为本机代码,因为默认阈值是10,000次迭代。即您将测试解释器执行字节代码所需的时间。这要慢得多,但仍然只有一毫秒的一小部分。即你有更高的机会看到1
,但仍然不太可能。
如果您想了解有关Java中低级别基准测试的更多信息,建议您阅读JMH和作者博客http://shipilev.net/
如果您想查看从Java代码生成的机器代码,建议您尝试JITWatch