衡量Android代码段执行时间的最佳方法是什么?
我之前和之后都有一段代码,我想放置时间戳以找出它的执行时间(例如onCreate()
中的一个和onDestroy()
活动方法中的另一个)。
我已经尝试了Time.toMillies(false)
,但它只向我返回秒数(结尾处为常量000
)。我还尝试了两个java函数:System.currentTimeMillis()
和System.nanoTime()
。
第一个返回毫秒的纪元时间,第二个没有。
衡量执行时间和获得良好精确度的最佳方法是什么?
答案 0 :(得分:64)
TimingLogger 怎么样?
来自https://support.google.com/mail/answer/188131文档:
TimingLogger timings = new TimingLogger(YOUR_TAG, "methodA");
// ... do some work A ...
timings.addSplit("work A");
// ... do some work B ...
timings.addSplit("work B");
// ... do some work C ...
timings.addSplit("work C");
timings.dumpToLog();
并且转储看起来像:
D/TAG (3459): methodA: begin
D/TAG (3459): methodA: 9 ms, work A
D/TAG (3459): methodA: 1 ms, work B
D/TAG (3459): methodA: 6 ms, work C
D/TAG (3459): methodA: end, 16 ms
不要忘记运行以下代码来启用代码:adb shell setprop log.tag.YOUR_TAG VERBOSE
答案 1 :(得分:11)
衡量执行时间的最佳方法是什么
System.nanoTime()
可能是个不错的选择。例如,Jake Wharton正在使用Hugo。
并获得良好的精确度
这不是严格可行的,因为在执行方法时设备上可能发生任何事情。这些外部因素会影响您的时间测量,通过窃取CPU时间,占用I / O通道等。您需要在多次运行中平均测试以尝试平均这些外部因素,并且精度/精度将受到影响结果
而且,正如Marcin Orlowski指出的那样,为了实际找出为什么你消耗了一定的时间,请使用Traceview。
答案 2 :(得分:5)
Kotlin开发人员
以毫秒为单位获取经过的时间:
val elapsedTime= measureTimeMillis {
// call you method from here or add any other statements
}
要在NanoSeconds中获取时间,
val elapsedTime= measureNanoTime {
// call you method from here or add any other statements
}
答案 3 :(得分:4)
您提出的问题称为profiling,还有一些工具可以帮助您解决Android问题。请参阅官方开发者网站上的文章Profiling with Traceview and dmtracedump。
答案 4 :(得分:4)
我通常使用System.nanoTime()
进行快速测量。
像这样的简单设置
val startTime = System.nanoTime()
//DO SOMETHING
Log.e("Measure", TASK took : " + ((System.nanoTime()-startTime)/1000000)+ "mS\n")