测量方法时间

时间:2013-06-17 08:40:18

标签: java android

我想优化一种方法,以便在更短的时间内运行。我正在使用System.currentTimeMillis()来计算它持续的时间。

但是,我刚刚阅读了System.currentTimeMillis() Javadoc,它说:

  

此方法不应用于测量超时或其他已用时间   时间测量,因为改变系统时间会影响结果。

所以,如果我不能用它来衡量经过的时间,我应该如何测量呢?

5 个答案:

答案 0 :(得分:2)

Android原生Traceview将帮助您衡量时间,并会为您提供更多信息。 使用它就像:

// start tracing to "/sdcard/calc.trace"
Debug.startMethodTracing("calc");
// ...
// stop tracing
Debug.stopMethodTracing();

Android开发者博客中包含more information的帖子

还要考虑@ Rajesh J Advani帖子。

答案 1 :(得分:1)

System.currentTimeMillis()存在一些问题。

  1. 如果你不能控制系统时钟,你可能会错误地读取经过的时间。
  2. 对于服务器代码或其他长期运行的java程序,您的代码可能会在几千次迭代中被调用。到这个时候结束时,JVM将优化字节码,使得所花费的时间实际上比您测试时测量的时间少得多。
  3. 它没有考虑到您的计算机上的其他进程或JVM中的其他线程可能会争用CPU时间这一事实。
  4. 您仍然可以使用此方法,但您需要牢记以上几点。正如其他人所提到的,分析器是衡量系统性能的更好方法。

答案 2 :(得分:1)

欢迎来到基准测试的世界。

正如其他人指出的那样 - 基于计时方法(如currentTimeMillis)的技术只会告诉您经过的时间,而不是方法在CPU中花费的时间。

我不知道在Java中将方法的时间与CPU花费的时间隔离的方法 - 答案是: 1)如果方法是长时间运行(或者你运行多次,同时使用基准测试规则,比如不丢弃每个结果),请使用类似Linux上的“时间”工具(http://linux.die.net/man/1/time),他们会告诉你如何应用程序花在CPU上的时间很长(显然你必须带走应用程序启动的开销等)。 2)像其他人指出的那样使用分析器。这具有诸如使用跟踪技术增加过多开销的危险 - 如果它使用堆栈采样,则不会100%准确 3)我不确定这对Android有多可行 - 但是你可以让你的bechmark在一个安静的多核系统上运行并隔离一个核心(或理想的整个套接字),只能运行你的应用程序。

答案 3 :(得分:-1)

您可以使用名为System.nanoTime()的内容。如此处所示 http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/System.html#nanoTime()

正如文件所说

  

此方法只能用于测量经过时间,与系统或挂钟时间的任何其他概念无关。

希望这会有所帮助。

答案 4 :(得分:-1)

SystemClock.elapsedRealtime()

在链接页面中引用单词:elapsedRealtime()和elapsedRealtimeNanos()返回自系统启动以来的时间,并包括深度睡眠。该时钟保证是单调的,即使在CPU处于省电模式时也会继续打勾,因此是通用间隔时序的推荐基础。