我正在寻找一种方法来测量我的 java 代码中不同方法的 cpu 使用率。我知道这可以使用 JNI 和 C 来实现,但我不知道从哪里开始......
这样做的目的是比较不同的算法,并提供定性的结果。
我正在寻找一种方法来测量我的 java 代码中不同方法的 cpu 使用率。我知道这可以使用 JNI 和 C 来实现,但我不知道从哪里开始......
这样做的目的是比较不同的算法,并提供定性的结果。
可能最常见的方法是使用采样。JVM 提供工具来询问所有线程(或您感兴趣的线程)的当前堆栈跟踪,以及它们消耗了多少 CPU。所以你会定期这样做。在每次调用时,如果一个线程在您感兴趣的方法内,则假设自该方法内的最后一次轮询以来它花费了报告的 CPU 时间的一半。
如果这种方法听起来合适,不久前我写了一些关于Java 5 分析工具的材料,可能会对您有所帮助。
Java 5 还提供了一个 Instrumentation 框架,通过该框架,您可以在加载类时对类进行检查,以包括对给定方法的入口和出口的调用,因此您可以仅在该方法内测量 CPU 使用率。但是,这有点复杂,因为您需要在加载实际的类二进制文件时对其进行修改。
Sun VisualVM 已集成在最近的 JDK中,这里解释了它的分析功能。请注意,如果我理解正确的话,它似乎需要一个相当最新的 OSX 版本。
Netbeans 在船上有基本相同的分析机器,我不知道这是否有帮助。
如果您想使用现有的分析工具之一,那么您可以尝试Shark
看看OperatingSystemMXBean
也许你可以在你的方法之前和之后看看一些东西
long startProcessCpuTime = operatingSystemMXBean.getProcessCpuTime();
long endProcessCpuTime = operatingSystemMXBean.getProcessCpuTime();
仅限 Java6
我不确定这是否是您想要的,但我过去曾使用jrat进行分析,并取得了不错的结果。
检查贾蒙。非常容易使用。
在单独的线程中调用您的方法并测量执行给定过程之前和之后的时间增量。
要测量进程调用的时间:
ManagementFactory.getThreadMXBean().setThreadCpuTimeEnabled(true);
long threadTime = ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();