我正在尝试找出哪些方法(特别是在主线程上)需要超过一秒钟才能执行。不幸的是,我正在使用DDMS和traceview,但我并不真正理解如何阅读提供的数据。是否有一种简单的方法来查找长时间运行的方法?
我正在尝试找出哪些方法(特别是在主线程上)需要超过一秒钟才能执行。不幸的是,我正在使用DDMS和traceview,但我并不真正理解如何阅读提供的数据。是否有一种简单的方法来查找长时间运行的方法?
每次调用方法时,您可以简单地打印出时间和方法名称。然后,您只需查看前一个时间戳与当前时间戳之间的差异是否大于您想要的时间(例如1秒)。
Calendar c = Calendar.getInstance();
int seconds = c.get(Calendar.SECOND);
SystemClock
类来计算函数调用前后的时间差。long time_start = SystemClock.elapsedRealtime();
myFunction();
long time_end = SystemClock.elapsedRealtime();
long diff = (time_end - time_start) / 1000;
Log.i("mytag", "Time Difference: " + diff + " seconds");
文档: http://developer.android.com/reference/android/os/SystemClock.html
这个链接是关于 Android 操作系统中 SystemClock 类的文档。该类提供了与系统时钟相关的方法。您可以使用该类来测量应用程序执行时间或跟踪事件之间的时间间隔。详细说明和示例请参见上述链接。关于如何使用traceview的教程,请参考:
请记住,网络或数据库调用可能需要很长时间,不应在主线程中调用,应使用后台线程或AsyncTask来完成这些调用。
除此之外,您还可以自己编写时间测量辅助方法,类似于以下示例(利用反射并以毫秒返回方法调用时间):
public static long timeMethod(Method m, Object obj, Object... args) {
long start = 0, stop = 0;
try {
start = SystemClock.uptimeMillis();
m.invoke(obj, args);
stop = SystemClock.uptimeMillis();
} catch (Exception e) {
return ERROR;
}
return stop - start;
}
我认为,如果想要精确,微秒可能是最好的选择:
”long startTime = System.nanoTime();
// ... the code being measured ...
long estimatedTime = System.nanoTime() - startTime;
http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#nanoTime%28%29
您也可以尝试使用断点调试器:http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html除了日历和系统时钟类外,我喜欢第三个选项: Apache Commons StopWatch
在方法开始时实例化该类并调用StopWatch的start方法,在方法结束时调用其stop方法。
然后toString方法会给出经过的时间。
//you could also use @Test(timeout=long)
@Test
public void testMethod()
{
YourClass test=new YourClass();
long s=System.getNanoTime();
//you could call your method directly here as well
assertEquals("name",50,test.yourMethod());
s=System.getNanoTime()-s;
}