Android中的时间码执行
Android中最容易执行的时间是什么?
我查了一下,并在Android SDK上find了TimingLogger,并在这里指示。 它看起来很方便。 但我无法得到它的工作。 这是我的代码:
TimingLogger timings = new TimingLogger("TopicLogTag", "Parsing html"); My code to time here... timings.dumpToLog();
它应该在LogCat中转储时间。 但是我什么也看不见..我做错了什么? Eclipse不显示任何变种。 我想它有一些冗长的输出,但我已经设置LogCat显示详细。 谢谢..
我给了它一个testing运行,我正在经历同样的事情。 这一切归结为在TimingLogger的Javadoc中的一点说明:
如果Log.isLoggable在创build时至less没有启用该标记的Log.VERBOSE级别,那么addSplit和dumpToLog调用将不会执行任何操作。
我在本地做了一个testing:
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代码 :
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时显然logging在VERBOSE上面,因为我的Log.d显然logging了。
您可以从[Log class Javadoc] [3]手动启用该标记的日志logging:
您可以通过设置系统属性来更改默认级别:'setprop log.tag。 'VERBOSE,DEBUG,INFO,WARN,ERROR,ASSERT或SUPPRESS等级。 SUPPRESS将会closures你的标签的所有logging。 您也可以创build一个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)
我发现了另一个更简单的解决scheme,它与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");
如果你们看看它的源代码 ,实际上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了。
有时候我们不需要知道手术的确切时间,但是我们想知道,为什么手术需要这么长时间。 因此,为了加快代码的速度,我们只需要知道某个操作部分的关系顺序,其中占用最多时间的部分似乎是您应该优化的部分。 所以,android带来了方法跟踪:
Debug.startMethodTracing("YOUR_TRACE_FILE_NAME"); // Do your operations Debug.stopMethodTracing();
然后,os将包含所有调用信息的跟踪文件写入文件系统。 只需将该文件traceview.bat
到traceview.bat
然后开始检查调用需要多长时间。
优点:
- 跟踪时可以检查所有被调用的函数和方法。
- 无需为multithreading应用程序同步数据。
- 跟踪是自动写入文件 – 没有日志猫魔法或任何必要的。 所有的数据封装在一起,准备好被检查。
- 一旦你开始添加时间测量,特别是日志logging,你无论如何破坏你的时间。
链接: http : //developer.android.com/tools/debugging/debugging-tracing.html
如果您仅按照developer.android.com中的说明查找日志,则无法查看日志。 所以使用下面的命令:
-
adb shell setprop log.tag.MyTag VERBOSE
注意 : MyTag是您在创build新TimingLogger时通过的第一个参数,如下所示:
TimingLogger timings = new TimingLogger("MyTag", "MyMethodName");
对于你的问题的答案,你应该执行以下命令: adb shell setprop log.tag.TopicLogTag VERBOSE
而你呢。 快乐编码!
尝试做:
adb shell logcat