2010-06-27 105 views
34

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

我环顾了一下,我在Android SDK上找到了TimingLogger, 和指令here。它看起来很方便。 但我无法得到它的工作。这是我的代码:

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

它应该转储LogCat中的时间。但我什么也看不见..我做错了什么? Eclipse不显示任何变种。我想它有一些冗长的输出,但我已经设置LogCat显示详细。 谢谢。

回答

56

我给它一试运行,我遇到了同样的事情。如果未启用 到至少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)

+3

谢谢,那就是了! 但是你需要至少有一个timings.addSplit才能真正测量任何时间。 而且您只需要为每个标记执行一次setprop。 太棒了! – droidgren 2010-06-28 15:58:12

+1

VERBOSE对于Android来说是“高于”DEBUG的。 – George 2012-02-13 23:00:04

+1

@mbafford:也许你应该更新答案,所以通过阅读它可以知道至少需要调用一次addSplit方法。 – wojciii 2012-11-01 09:47:49

0

尝试这样做:

adb shell logcat 
+0

我会尝试一下,但我不明白为什么它应该不同于日食中的logcat面板。 – droidgren 2010-06-28 07:02:41

+0

@droidgren:我通常先尝试一下,以确保它不会出现eclipse问题。 – Macarse 2010-06-28 13:32:17

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"); 
+3

如果使用java.lang.System.nanoTime(),则使用J2SE调用将获得与uptimeMillis()相同的时钟,并且分辨率更高(稍好)。但请注意,TimingLogger会使用elapsedRealtime()时钟(保持“深度睡眠”时间)。 – fadden 2010-06-28 21:01:03

2

有时我们不需要知道确切的时间,但我们想知道,为什么这项手术花了这么长时间。因此,为了加速代码,我们只需要知道某种操作部分的关系顺序,其中占用最多时间的部分似乎是您应该优化的部分。因此,android带来了方法追踪:

Debug.startMethodTracing("YOUR_TRACE_FILE_NAME"); 

// Do your operations 

Debug.stopMethodTracing(); 

然后,os将包含所有调用信息的跟踪文件写入文件系统。 只需将该文件拖放到traceview.bat上,然后开始检查通话需要多长时间。

优点:

  • 您可以检查,同时跟踪已调用所有调用的函数和方法。
  • 无需为多线程应用程序同步数据。
  • 跟踪自动写入文件 - 没有日志猫魔法或任何必要的。所有数据封装在一起,随时可以进行检查。
  • 只要您开始添加时间测量功能,尤其是日志记录功能,无论如何您都会破坏您的时间。

链接:http://developer.android.com/tools/debugging/debugging-tracing.html

+0

这应该可能在线程上更高! – 2015-09-09 10:08:28

+0

什么是“traceview.bat”?我在哪里得到它? – 2017-07-20 13:19:48

8

如果你们看一看其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了。

+2

好人!有用 – Tooto 2016-04-26 13:00:51

3

如果您只是按照developer.android.com中的说明查找日志,您将无法看到日志。因此,使用下面的命令:

  1. adb shell setprop log.tag.MyTag VERBOSE

注意MyTag是创建如下新TimingLogger当你传递的第一个参数:

TimingLogger timings = new TimingLogger("MyTag", "MyMethodName");

对于你的问题的回答,你应该执行以下命令: adb shell setprop log.tag.TopicLogTag VERBOSE

你就在那里。快乐编码!