0

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

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

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

那么,如果我不应该用它来测量经过的时间,我应该如何测量呢?

4

5 回答 5

2

Android 原生Traceview将帮助您测量时间并为您提供更多信息。使用它很简单:

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

Android 开发者博客中包含更多信息的帖子

还要考虑@ Rajesh J Advani的帖子。

于 2013-06-17T08:54:21.917 回答
1

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

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

我不知道Java中有一种方法可以将方法的时间与它在CPU上花费的时间隔离开来-答案是:1)如果该方法运行时间很长(或者您在使用基准测试时运行了很多次规则,例如不要丢弃每个结果),使用 Linux 上的“时间”工具(http://linux.die.net/man/1/time )) 谁会告诉你应用程序在 CPU 上花费了多长时间(显然你必须消除应用程序启动等的开销)。2)使用其他人指出的分析器。这有危险,例如使用跟踪技术增加了太多开销 - 如果它使用堆栈采样,它不会是 100% 准确 3) 我不确定这在 android 上有多可行 - 但你可以让你的 bechmark 在安静的多核上运行系统并隔离一个核心(或理想情况下是整个套接字)以仅能够运行您的应用程序。

于 2013-06-17T08:56:56.420 回答
1

有一些问题System.currentTimeMillis()

  1. 如果您无法控制系统时钟,则您可能会错误地读取经过的时间。
  2. 对于服务器代码或其他长时间运行的 Java 程序,您的代码可能会在数千次迭代中被调用。到此时间结束时,JVM 将优化字节码,使得所花费的时间实际上比您在测试中测量的时间要少得多。
  3. 它没有考虑到您的计算机上可能有其他进程或 JVM 中的其他线程竞争 CPU 时间的事实。

您仍然可以使用该方法,但您需要牢记以上几点。正如其他人所提到的,分析器是衡量系统性能的更好方法。

于 2013-06-17T08:49:41.257 回答
-1

您可以使用名为 System.nanoTime() 的东西。如此处给出的 http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/System.html#nanoTime()

正如文件所说

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

希望这会有所帮助。

于 2013-06-17T08:45:21.467 回答
-1

SystemClock.elapsedRealtime()

引用链接页面中的文字:elapsedRealtime() 和 elapsedRealtimeNanos() 返回系统启动后的时间,包括深度睡眠。这个时钟保证是单调的,即使在 CPU 处于省电模式时也会继续计时,因此是通用间隔计时的推荐基础。

于 2013-06-17T08:45:25.560 回答