测量Android执行时间的最佳方法?

223*_*112 26 java android

测量Android代码段执行时间的最佳方法是什么?

我之前和之后都有一段代码,我想放置时间戳来找出它的执行时间(例如,活动方法中的一个onCreate()和另一个onDestroy()).

我试过了Time.toMillies(false),但它只给了我几秒钟(000最后一直是常数).我还尝试了两个java函数:System.currentTimeMillis()System.nanoTime().第一个返回毫秒的纪元时间,第二个没有.

什么是衡量执行时间和获得良好精度的最佳方法?

Mik*_*keL 73

那么TimingLogger呢?

来自TimingLogger文档:

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();
Run Code Online (Sandbox Code Playgroud)

转储看起来像:

     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
Run Code Online (Sandbox Code Playgroud)

不要忘记通过运行来启用您的标记: adb shell setprop log.tag.YOUR_TAG VERBOSE

  • @LarsH"VERBOSE"必要的原因是因为当`TimingLogger`被初始化时,`reset()`方法只有在`Log.isLoggable(mTag,Log.VERBOSE)`求值为'true`时才启用记录器. (3认同)
  • 算命先生 TimingLogger 自 API 级别 30 起已被“弃用”。 (3认同)
  • 我的诀窍是我克隆了TimingLogger类并使它不检查VERBOSE.这可能有所帮助. (2认同)

Com*_*are 15

什么是衡量执行时间的最佳方法

System.nanoTime()可能是个不错的选择.例如,杰克沃顿就和雨果一起使用它.

并获得良好的精度

这不是严格可行的,因为在您的方法执行时,设备上可能发生任何事情.这些外部因素会影响您的时间测量,通过窃取CPU时间,占用I/O通道等.您需要在多次运行中平均测试以尝试平均这些外部因素,并且精度/精度将受到影响结果.

而且,正如Marcin Orlowski指出的那样,要真正弄清楚为什么要消耗一定的时间,请使用Traceview.

  • 从技术上讲,只有_准确性_受到影响。精度始终是纳秒。 (5认同)

Sur*_*nav 10

Kotlin 开发人员

要以毫秒为单位获取经过的时间:

val elapsedTime= measureTimeMillis {
            // call you method from here or add any other statements
} 
Run Code Online (Sandbox Code Playgroud)

要获取 NanoSeconds 中的时间:

val elapsedTime= measureNanoTime {
            // call you method from here or add any other statements
}
Run Code Online (Sandbox Code Playgroud)


Hit*_*ahu 8

我通常 System.nanoTime()用于快速测量。

像这样的简单设置

   val startTime =   System.nanoTime()

    //DO SOMETHING

   Log.e("Measure", TASK took : " +  ((System.nanoTime()-startTime)/1000000)+ "mS\n")
Run Code Online (Sandbox Code Playgroud)


Mar*_*ski 5

您所要求的是所谓的概要分析,也有一些工具可以在Android上为您提供帮助。请参阅官方开发人员网站上的使用Traceview和dmtracedump进行分析的文章。