Android中的时间码执行

时间:2010-06-27 17:29:54

标签: android

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

我看了一下,我在Android SDK上找到了TimingLogger, 和指示here。看起来很方便。 但我无法让它发挥作用。这是我的代码:

TimingLogger timings = new TimingLogger("TopicLogTag", "Parsing html");
   My code to time here...
timings.dumpToLog();

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

6 个答案:

答案 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中的说明查找日志,则无法查看日志。所以使用下面的命令:

  1. adb shell setprop log.tag.MyTag VERBOSE
  2. 注意 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