一般概念-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
我很好奇我们如何通过查看某些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