一般概念-java 代码和周期时钟

general concept-java code and cycle clocks

我很好奇我们如何通过查看某些java代码来知道CPU需要多少个时钟周期。

ex:

public class Factorial
{
    public static void main(String[] args)
    {   final int NUM_FACTS = 100;
        for(int i = 0; i < NUM_FACTS; i++)
            System.out.println( i + "! is " + factorial(i));
    }

    public static int factorial(int n)
    {   int result = 1;
        for(int i = 2; i <= n; i++)
            result *= i;
        return result;
    }
}

I am just curious how can we know how many cycle clocks CPU needs by looking through certain java code.

如果你说的是真正的硬件时钟周期,答案是"You can't know"1

之所以如此困难,是因为程序在执行之前和执行期间要经历许多复杂的(而且基本上是不透明的)转换:

  • 源代码提前编译成字节码。这取决于使用的字节码编译器。
  • 字节码在执行期间的某个时间被 JIT 编译为本机代码。这取决于执行平台中的 JIT 编译器以及应用程序的执行行为。
  • 执行给定指令序列所需的时钟周期数取决于本机代码,CPU 模型包括内存缓存大小和...应用程序的内存访问模式。
  • 最重要的是,JVM 有各种来源的 "under the hood" 不确定性,以及影响行为的各种启动时调整参数......和周期计数。

但幸运的是,有一些不依赖于测量硬件时钟周期的实用方法来检查软件性能。您可以:

  • 测量或估计执行的本机指令,
  • 测量或估计执行的字节码,
  • 估计执行的Java级操作或语句,或
  • 运行 代码并测量所用时间。

一般最后两个最实用

1 - ... 除了 运行 在 准确 硬件级模拟器上运行应用程序/JVM 以获得您的确切硬件配置和让模拟器计算时钟周期。老实说,我不知道运行到那个级别的模拟器是否真的存在。如果有,它们很可能是 Intel、AMD 等公司的专利。

我不认为你能够知道时钟周期。

但您可以测量 运行 代码花费的 CPU 时间。

您需要使用 java.lang.management API。

看这里:

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/management/ThreadMXBean.html