2010-06-27 102 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

你就在那裏。快樂編碼!