如何在Java中捕获方法的cpu时间?

时间:2014-04-12 19:57:40

标签: java visualvm

我试图捕获方法的cpu时间而不是运行时间。 我知道我可以使用

long startTime = System.nanoTime();
methodToTime();
long endTime = System.nanoTime();
long duration = endTime - startTime;

捕获系统时间。我在这里找到了一些东西http://nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking 所以我使用它的方法。以下是我写的用于获取cpu时间,系统时间,用户时间的类。

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadMXBean;

public class Profile {
  public Profile(){}
  /** Get CPU time in nanoseconds. 
   * @return long*/  
  public static long getCpuTime( ) {
      ThreadMXBean bean = ManagementFactory.getThreadMXBean( );
      return bean.isCurrentThreadCpuTimeSupported( )?bean.getCurrentThreadCpuTime( ) : 0L;
  }

  /** Get user time in nanoseconds. 
   * @return long*/
  public static long getUserTime( ) {
      ThreadMXBean bean = ManagementFactory.getThreadMXBean( );
      return bean.isCurrentThreadCpuTimeSupported( ) ?
          bean.getCurrentThreadUserTime( ) : 0L;
      }

  /** Get system time in nanoseconds. 
   * @return long*/
  public static long getSystemTime( ) {
      ThreadMXBean bean = ManagementFactory.getThreadMXBean( );
      return bean.isCurrentThreadCpuTimeSupported( ) ?
          (bean.getCurrentThreadCpuTime( ) - bean.getCurrentThreadUserTime( )) : 0L;
  }
}

然后我使用以下内容来捕获cpu时间。

long startTime = Profiler.getCputTime();
methodToTime();
long endTime = Profiler.getCputTime();
long duration = endTime - startTime;

但是,持续时间为零。我知道在那个网页上,它确实解释了 http://nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking#AppendixTimesandlackofnanosecondaccuracy 时间精度通常不会好于几千纳秒。更常见的是它们只有几毫秒。

那么还有什么可以捕获CPU时间吗? (我无法使用该方法运行methodToTime()数百次,直到可以捕获CPU时间。)

现在我使用VisualVM来捕获时间。有谁知道VisualVM是在捕获CPU时间还是系统时间?因为我得到的值接近我使用System.nanoTime()捕获的系统时间。 或者任何人都可以建议一个可以捕获方法的cpu时间的分析器,并且可以分别捕获每次调用方法的cpu时间。(我注意到VisualVM只能捕获总时间和调用)。

谢谢。

0 个答案:

没有答案