我想优化一种方法,使其运行时间更短。我System.currentTimeMillis()
用来计算它持续的时间。
但是,我刚刚阅读了System.currentTimeMillis()
Javadoc,它说:
此方法不应用于测量超时或其他经过的时间测量,因为更改系统时间会影响结果。
那么,如果我不应该用它来测量经过的时间,我应该如何测量呢?
Android 原生Traceview将帮助您测量时间并为您提供更多信息。使用它很简单:
// start tracing to "/sdcard/calc.trace"
Debug.startMethodTracing("calc");
// ...
// stop tracing
Debug.stopMethodTracing();
Android 开发者博客中包含更多信息的帖子
还要考虑@ Rajesh J Advani的帖子。
欢迎来到基准测试的世界。
正如其他人指出的那样 - 基于诸如 currentTimeMillis 之类的计时方法的技术只会告诉您经过的时间,而不是该方法在 CPU 中花费的时间。
我不知道Java中有一种方法可以将方法的时间与它在CPU上花费的时间隔离开来-答案是:1)如果该方法运行时间很长(或者您在使用基准测试时运行了很多次规则,例如不要丢弃每个结果),使用 Linux 上的“时间”工具(http://linux.die.net/man/1/time )) 谁会告诉你应用程序在 CPU 上花费了多长时间(显然你必须消除应用程序启动等的开销)。2)使用其他人指出的分析器。这有危险,例如使用跟踪技术增加了太多开销 - 如果它使用堆栈采样,它不会是 100% 准确 3) 我不确定这在 android 上有多可行 - 但你可以让你的 bechmark 在安静的多核上运行系统并隔离一个核心(或理想情况下是整个套接字)以仅能够运行您的应用程序。
有一些问题System.currentTimeMillis()
。
您仍然可以使用该方法,但您需要牢记以上几点。正如其他人所提到的,分析器是衡量系统性能的更好方法。
您可以使用名为 System.nanoTime() 的东西。如此处给出的 http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/System.html#nanoTime()
正如文件所说
此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关。
希望这会有所帮助。
引用链接页面中的文字:elapsedRealtime() 和 elapsedRealtimeNanos() 返回系统启动后的时间,包括深度睡眠。这个时钟保证是单调的,即使在 CPU 处于省电模式时也会继续计时,因此是通用间隔计时的推荐基础。