Android中的时间码执行

dro*_*ren 34 android

什么是Android中最容易执行的时间?

我看了一下,我在Android SDK上找到了TimingLogger,并在这里给出了说明.看起来很方便.但我无法让它发挥作用.这是我的代码:

TimingLogger timings = new TimingLogger("TopicLogTag", "Parsing html");
   My code to time here...
timings.dumpToLog();
Run Code Online (Sandbox Code Playgroud)

它应该在LogCat中转储时间.但是我看不到任何东西......我做错了什么?Eclipse没有显示任何变量.我猜它有一些详细的输出,但是我已经设置了LogCat以显示Verbose.谢谢..

mba*_*ord 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();
Run Code Online (Sandbox Code Playgroud)

奇怪的是,我得到了日志的输出:

06-28 08:35:18.693: DEBUG/MyTag(24366): Is Loggable? false
Run Code Online (Sandbox Code Playgroud)

但就是这样.因为它是假的,我怀疑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     }
Run Code Online (Sandbox Code Playgroud)

我不确定为什么当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
# 
Run Code Online (Sandbox Code Playgroud)

结果是:

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
Run Code Online (Sandbox Code Playgroud)

看看droidgren对这个答案的评论 - 显然对addSplit的调用也是必要的.

[3]:http://developer.android.com/reference/android/util/Log.html#isLoggable(java.lang.String ,int)

  • 谢谢你,做到了!但是你需要至少有一个timings.addSplit来实时测量.而且你只需要为每个标签做一次setprop.大! (3认同)

dro*_*ren 9

我找到了另一个更简单的解决方案,它测量与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");
Run Code Online (Sandbox Code Playgroud)

  • 如果你使用java.lang.System.nanoTime(),你将获得与uptimeMillis()相同的时钟,使用J2SE调用(稍微)更好的分辨率.但请注意,TimingLogger使用elapsedRealtime()时钟(保持时间跨越"深度睡眠"). (3认同)

kan*_*eda 8

如果你们看看它的源代码,实际上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);
}
Run Code Online (Sandbox Code Playgroud)

这里的问题正在发生变化

mDisabled = !Log.isLoggable(mTag, Log.VERBOSE);

mDisabled = false;

这样我们就不必乱用adb了.