1

我正在寻找一种方法来测量我的 java 代码中不同方法的 cpu 使用率。我知道这可以使用 JNI 和 C 来实现,但我不知道从哪里开始......

这样做的目的是比较不同的算法,并提供定性的结果。

4

8 回答 8

1

我认为您无法使用当前的分析器范围真正确定 CPU 使用率到方法级别。对于大多数方法来说,这很明显(如果该方法是计算密集型和单线程的,那么它将使用 100% 的 CPU 并由操作系统分配)。

不过,您可能想要识别热点(这些方法消耗的 CPU 比您预期的要多 - 或者可能更少?),我建议您查看YourKit以获得易于配置的分析器。

如果做不到这一点,请查看 JVM Profiling Interface ( JVMPI ),它可能会给您一些进一步的指示。

于 2009-10-06T11:09:44.420 回答
1

可能最常见的方法是使用采样。JVM 提供工具来询问所有线程(或您感兴趣的线程)的当前堆栈跟踪,以及它们消耗了多少 CPU。所以你会定期这样做。在每次调用时,如果一个线程在您感兴趣的方法内,则假设自该方法内的最后一次轮询以来它花费了报告的 CPU 时间的一半。

如果这种方法听起来合适,不久前我写了一些关于Java 5 分析工具的材料,可能会对您有所帮助。

Java 5 还提供了一个 Instrumentation 框架,通过该框架,您可以在加载类时对类进行检查,以包括对给定方法的入口和出口的调用,因此您可以仅在该方法内测量 CPU 使用率。但是,这有点复杂,因为您需要在加载实际的类二进制文件时对其进行修改。

于 2009-10-06T11:31:05.453 回答
1

Sun VisualVM 已集成在最近的 JDK中,这里解释了它的分析功能请注意,如果我理解正确的话,它似乎需要一个相当最新的 OSX 版本。
Netbeans 在船上有基本相同的分析机器,我不知道这是否有帮助。

于 2009-10-06T11:36:23.697 回答
0

如果您想使用现有的分析工具之一,那么您可以尝试Shark

于 2009-10-06T11:00:07.400 回答
0

看看OperatingSystemMXBean也许你可以在你的方法之前和之后看看一些东西

long startProcessCpuTime = operatingSystemMXBean.getProcessCpuTime();
long endProcessCpuTime = operatingSystemMXBean.getProcessCpuTime();

仅限 Java6

于 2009-10-06T11:12:58.580 回答
0

我不确定这是否是您想要的,但我过去曾使用jrat进行分析,并取得了不错的结果。

于 2009-10-06T11:40:14.937 回答
0

检查贾蒙。非常容易使用。

于 2009-11-12T15:25:18.223 回答
0

在单独的线程中调用您的方法并测量执行给定过程之前和之后的时间增量。

要测量进程调用的时间:

    ManagementFactory.getThreadMXBean().setThreadCpuTimeEnabled(true);
    long threadTime = ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();
于 2012-06-03T00:56:36.560 回答