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

时间:2015-02-18 14:39:06

标签: java performance jvm cpu milliseconds

在Java中我想测量

的时间
  1. 1000整数比较(“<”运算符),
  2. 1000个整数加法(a + b 每个案例针对不同的a和b),
  3. 另一个简单的操作。
  4. 我知道我可以通过以下方式实现:

    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?有什么建议吗?

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

1 个答案:

答案 0 :(得分:2)

  

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

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

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

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

如果您想了解有关Java中低级别基准测试的更多信息,建议您阅读JMH和作者博客http://shipilev.net/

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