当前位置: 首页 > 知识库问答 >
问题:

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

许学真
2023-03-14

什么是最好的方法来衡量Android代码段的执行时间?

我有一段前后的代码,我想用时间戳来确定它的执行时间(例如,onCreate()中的一段,以及onDestroy()活动方法中的另一段)。

我已经试过了。toMillies(false),但它只会向我返回秒数(最后是常量000)。我还尝试了两个java函数:System。currentTimeMillis()系统。nanoTime()。第一个返回纪元时间的毫秒,第二个不返回。

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

共有3个答案

连晟
2023-03-14

科特林开发

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

val elapsedTime= measureTimeMillis {
            // call you method from here or add any other statements
} 

要以纳秒为单位获取时间:

val elapsedTime= measureNanoTime {
            // call you method from here or add any other statements
}
凌永逸
2023-03-14

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

系统。nanoTime()可能是个不错的选择。例如,杰克·沃顿(Jake Wharton)就在用雨果(Hugo)这个词。

并获得良好的精度

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

正如Marcin Orlowski所指出的,要真正弄清楚为什么你要消耗一定数量的时间,请使用Traceview。

严兴旺
2023-03-14

定时记录器呢?

从计时记录器文档:

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来启用标记。标签你的标签冗长

 类似资料:
  • 问题内容: System.currentTimeMillis()是Java时间性能的最佳衡量标准吗?使用此工具将采取行动之前的时间与采取行动之后的时间进行比较时是否有陷阱?有更好的选择吗? 问题答案: 我希望不会- 这是我不使用时使用的。

  • 我的目标是编写一个用于测量方法执行或事务时间以及处理测量的框架,即存储、分析等事务可能包括对外部系统的调用,并同步或异步等待结果。 已经有一些问题围绕着这个话题,比如 “如何对方法的执行进行计时” “度量Java方法的执行时间” “System.CurrentTimeMillis vs System.NanoTime” 所有的答案都可以归结为三种花时间的方法 和(自Java八号以来) 我知道,所有

  • 问题内容: 我有一个方法,可以写入数据库。要求是确保经过一定时间后该方法不执行。如果在此之前返回,则什么也不做。 我能想到的一种基本方法就是这样做。 这种方法的一个问题是,即使方法在最大总执行时间之前返回,程序也会暂停以等待经过的时间。 我该如何做得更好(或更正确)?如果使用,我们如何找出执行该方法的对象? 问题答案: 您可以通过将工作发送给执行者来做到这一点:

  • 我有一个处理实时事件的系统。用户可以在指定的时间间隔插入自定义事件。实时引擎使用java.time.Duration来计时事件。通过jsp向用户展示一个菜单,该菜单以(全)秒为单位指定Duration。事件列表被序列化为Long值。所以我有三种使用相同值的方法。我创建了一个值对象,在每次访问时执行转换,这样我就不必将转换分散在整个代码中。我想知道是否有更好的方法来完成这个场景。这是我的VO。

  • 问题内容: 我正在尝试编写一个小型节点应用程序,该应用程序将搜索并解析文件系统上的大量文件。为了加快搜索速度,我们尝试使用某种类型的map reduce。该计划将是以下简化方案: Web请求带有搜索查询 启动3个进程,每个进程分配1000个(不同)文件 进程完成后,它将“返回”结果回到主线程 一旦所有进程完成,主线程将通过返回组合结果作为JSON结果来继续 我对此有以下疑问: 这在Node中可行吗

  • 我假设MAX统计数据是执行请求的最大时间(因为我已经发出了两个请求,所以它是对其中一个请求进行较长处理的时间)。 每当我通过任何标记筛选度量,如 我总是得到0.0作为一个最大的时间。这是什么原因?