一般概念-java代码和循环时钟

时间:2015-09-06 01:24:37

标签: java clock cycle concept

我很好奇我们如何通过查看某些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;
    }
}

2 个答案:

答案 0 :(得分:3)

  

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

如果你在谈论真正的硬件时钟周期,答案是“你不能知道” 1

它是如此困难的原因是程序在执行之前和执行期间经历了许多复杂的(并且很大程度上不透明)转换:

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

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

  • 衡量或估算已执行的原生指令,
  • 测量或估算执行的字节码,
  • 估计执行的Java级操作或语句,或
  • 运行代码并测量所花费的时间。

最后两个通常是最实用的。

1 - ...除了在准确的硬件级仿真器上运行应用程序/ JVM以获得精确的硬件配置并让仿真器计算时钟周期。说实话,我不知道运行到那个级别的模拟器是否确实存在。如果他们这样做,他们很可能是英特尔,AMD等专有的。

答案 1 :(得分:0)

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

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

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

看看这里:

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