Android中最容易执行的时间是什么?
我看了一下,我在Android SDK上找到了TimingLogger, 和指示here。看起来很方便。 但我无法让它发挥作用。这是我的代码:
TimingLogger timings = new TimingLogger("TopicLogTag", "Parsing html");
My code to time here...
timings.dumpToLog();
它应该在LogCat中转储时间。但是我看不到任何东西......我做错了什么? Eclipse没有显示任何变量。我猜它有一些详细的输出,但是我已经设置了LogCat以显示Verbose。 谢谢..
答案 0 :(得分:57)
我给了它一个测试运行,我遇到了同样的事情。这一切归结为Javadoc for TimingLogger中的这一点描述:
如果未启用Log.isLoggable 至少为Log.VERBOSE级别 那个标签在创建时那么 addSplit和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明显记录在VERBOSE之上时为什么返回false,因为我的Log.d明显记录了。
您可以从[Log class 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)
答案 1 :(得分:8)
我找到了另一个更简单的解决方案,它测量与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");
答案 2 :(得分:8)
如果你们看看它的source code,实际上TimingLogger类的实现非常简单。
所以我所做的,完全适合我的用例,是制作我自己的类版本,但将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 = !Log.isLoggable(mTag, Log.VERBOSE);
到
mDisabled = false;
这样我们就不必混淆adb。
答案 3 :(得分:3)
如果您只是按照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
你就是。快乐的编码!!!
答案 4 :(得分:2)
有时我们不需要知道我们进行手术的确切时间,但我们想知道为什么手术需要这么长时间。因此,为了加速代码,我们只需要知道该操作的某些部分的关系顺序,其中占用时间最多的那个似乎是您应该优化的那个。因此,android带来了方法跟踪:
Debug.startMethodTracing("YOUR_TRACE_FILE_NAME");
// Do your operations
Debug.stopMethodTracing();
然后,操作系统将包含所有调用信息的跟踪文件写入文件系统。
只需将该文件拖放到traceview.bat
上,然后开始检查哪些调用花了多长时间。
优点:
链接:http://developer.android.com/tools/debugging/debugging-tracing.html
答案 5 :(得分:0)
尝试做:
adb shell logcat