Android中的时间代码执行
Android中最容易执行的时间是什么?Android中的时间代码执行
我环顾了一下,我在Android SDK上找到了TimingLogger, 和指令here。它看起来很方便。 但我无法得到它的工作。这是我的代码:
TimingLogger timings = new TimingLogger("TopicLogTag", "Parsing html");
My code to time here...
timings.dumpToLog();
它应该转储LogCat中的时间。但我什么也看不见..我做错了什么? Eclipse不显示任何变种。我想它有一些冗长的输出,但我已经设置LogCat显示详细。 谢谢。
我给它一试运行,我遇到了同样的事情。如果未启用 到至少Log.VERBOSE水平 该标签在创建时则 addSplit和Log.isLoggable
:这一切都归结于描述在Javadoc for TimingLogger这一点点dumpToLog调用将不会执行 。
我做了一个测试本地:
TimingLogger timings = new TimingLogger("MyTag", "Initialization");
Log.d("MyTag", "Is Loggable? " + Log.isLoggable("MyTag", Log.VERBOSE));
timings.dumpToLog();
而且奇怪的是,我得到一个输出到日志:
06-28 08:35:18.693: DEBUG/MyTag(24366): Is Loggable? false
但仅此而已。而且因为它是假的,我怀疑TimingLogger是基于做任何事情时,TimingLogger code:
90 /**
91 * Clear and initialize a TimingLogger object that will log using
92 * the tag and label that was specified previously, either via
93 * the constructor or a call to reset(tag, label). If the
94 * Log.isLoggable is not enabled to at least the Log.VERBOSE
95 * level for that tag at creation time then the addSplit and
96 * dumpToLog call will do nothing.
97 */
98 public void reset() {
99 mDisabled = !Log.isLoggable(mTag, Log.VERBOSE);
100 if (mDisabled) return;
101 if (mSplits == null) {
102 mSplits = new ArrayList<Long>();
103 mSplitLabels = new ArrayList<String>();
104 } else {
105 mSplits.clear();
106 mSplitLabels.clear();
107 }
108 addSplit(null);
109 }
我不知道为什么Log.isLoggable是返回false当它以高于VERBOSE明显日志,因为我Log.d明显登录。
您可以启用从[Log类的Javadoc]手动该标签记录[3]:“setprop log.tag:
您可以通过设置 系统属性更改默认的水平。 '其中 级别是VERBOSE,DEBUG,INFO, WARN,ERROR,ASSERT或SUPPRESS。 SUPPRESS将关闭所有日志记录 您的标记。您还可以创建一个 local.prop文件,其中包含 : 'log.tag。='和 将其放置在/data/local.prop中。
这一点我通过adb shell
做:
$ adb shell
# setprop
usage: setprop <key> <value>
# setprop log.tag.MyTag VERBOSE
#
结果:
06-28 08:53:42.447: DEBUG/MyTag(24739): Is Loggable? true
06-28 08:53:44.744: DEBUG/MyTag(24739): Initialization: begin
06-28 08:53:44.744: DEBUG/MyTag(24739): Initialization: end, 0 ms
见droidgren对这个答案的评论 - 这显然是为了addSplit呼叫也是必要的。
[3]:http://developer.android.com/reference/android/util/Log.html#isLoggable(java.lang.String,INT)
我发现另一个更简单的解决方案,其测量的确切相同的时间TimingLogger,不需要setprop。
private long startnow;
private long endnow;
startnow = android.os.SystemClock.uptimeMillis();
*Your time consuming code here*
endnow = android.os.SystemClock.uptimeMillis();
Log.d("MYTAG", "Execution time: " + (endnow - startnow) + " ms");
如果使用java.lang.System.nanoTime(),则使用J2SE调用将获得与uptimeMillis()相同的时钟,并且分辨率更高(稍好)。但请注意,TimingLogger会使用elapsedRealtime()时钟(保持“深度睡眠”时间)。 – fadden 2010-06-28 21:01:03
有时我们不需要知道确切的时间,但我们想知道,为什么这项手术花了这么长时间。因此,为了加速代码,我们只需要知道某种操作部分的关系顺序,其中占用最多时间的部分似乎是您应该优化的部分。因此,android带来了方法追踪:
Debug.startMethodTracing("YOUR_TRACE_FILE_NAME");
// Do your operations
Debug.stopMethodTracing();
然后,os将包含所有调用信息的跟踪文件写入文件系统。 只需将该文件拖放到traceview.bat
上,然后开始检查通话需要多长时间。
优点:
- 您可以检查,同时跟踪已调用所有调用的函数和方法。
- 无需为多线程应用程序同步数据。
- 跟踪自动写入文件 - 没有日志猫魔法或任何必要的。所有数据封装在一起,随时可以进行检查。
- 只要您开始添加时间测量功能,尤其是日志记录功能,无论如何您都会破坏您的时间。
链接:http://developer.android.com/tools/debugging/debugging-tracing.html
这应该可能在线程上更高! – 2015-09-09 10:08:28
什么是“traceview.bat”?我在哪里得到它? – 2017-07-20 13:19:48
如果你们看一看其source code,实际上为TimingLogger类的实现是相当简单的。
所以我做了什么,这完全符合我的使用情况,是为了让我自己版本的类,但是从
mDisabled = !Log.isLoggable(mTag, Log.VERBOSE);
改变reset()
方法
public void reset() {
mDisabled = false; // <- This is what has changed.
if (mDisabled) return;
if (mSplits == null) {
mSplits = new ArrayList<Long>();
mSplitLabels = new ArrayList<String>();
} else {
mSplits.clear();
mSplitLabels.clear();
}
addSplit(null);
}
这里的捕捞量变化
到
mDisabled = false;
这样我们就不用乱用adb了。
好人!有用 – Tooto 2016-04-26 13:00:51
如果您只是按照developer.android.com中的说明查找日志,您将无法看到日志。因此,使用下面的命令:
adb shell setprop log.tag.MyTag VERBOSE
注意:MyTag是创建如下新TimingLogger当你传递的第一个参数:
TimingLogger timings = new TimingLogger("MyTag", "MyMethodName");
对于你的问题的回答,你应该执行以下命令: adb shell setprop log.tag.TopicLogTag VERBOSE
你就在那里。快乐编码!
谢谢,那就是了! 但是你需要至少有一个timings.addSplit才能真正测量任何时间。 而且您只需要为每个标记执行一次setprop。 太棒了! – droidgren 2010-06-28 15:58:12
VERBOSE对于Android来说是“高于”DEBUG的。 – George 2012-02-13 23:00:04
@mbafford:也许你应该更新答案,所以通过阅读它可以知道至少需要调用一次addSplit方法。 – wojciii 2012-11-01 09:47:49