我试图捕获方法的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只能捕获总时间和调用)。
谢谢。