【问题标题】:general concept-java code and cycle clocks一般概念-java代码和周期时钟
【发布时间】:2015-09-06 01:24:36
【问题描述】:

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

【问题讨论】:

  • 顺便说一下,现代的单个时钟周期可以处理多个进程,因此仅通过 java 程序查看数量很难找出。我相信还有很多其他因素。

标签: java clock cycle concept


【解决方案1】:

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

如果您谈论的是真正的硬件时钟周期,答案是“您无法知道”1

之所以如此困难,是因为程序在执行之前和执行过程中会经历许多复杂(并且很大程度上是不透明的)转换:

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

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

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

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

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

【讨论】:

  • 您能举例说明如何进行所有这些测量吗?
  • 你还记得你在哪里读到的吗?我正在尝试做类似的事情。如果您不想要精确的结果,而只想进行估算怎么办?
  • 我没有“阅读”。这些建议是基于我在过去 20 年左右的时间里获得的 Java 知识以及更广泛的计算知识。就像我说的那样,如果您需要有关如何在时钟周期、机器指令或字节码级别测量软件性能的建议,请再问一个(或多个)问题。
【解决方案2】:

我认为你无法知道时钟周期。

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

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

看这里:

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

【讨论】:

    猜你喜欢
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    相关资源
    最近更新 更多