Выполнение тайм-кода в Android

Какое самое простое время для исполнения на Android?

Я немного оглянулся, и я нашел TimingLogger на Android SDK и инструкции здесь . Это выглядит очень удобно. Но я не могу заставить его работать. Это мой код:

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

Он должен сбросить время в LogCat. Но я ничего не вижу. Я что делаю неправильно? Eclipse не показывает никаких лаков. Я предполагаю, что у него есть что-то с подробным выводом, но я установил LogCat для отображения Verbose. Спасибо..

Solutions Collecting From Web of "Выполнение тайм-кода в Android"

Я дал ему пробный прогон, и я испытываю то же самое. Все это сводится к этому немногому описанию в Javadoc для 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 :

  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 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 

См. Комментарий дроидрена на этот ответ – видимо, необходим вызов addSplit.

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

Я нашел еще одно более простое решение, которое измеряет то же время, что и 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.

Иногда нам не нужно знать точное время, которое потребовало нам операции, но мы хотим знать, почему эта операция заняла так много времени. Таким образом, для ускорения кода нам нужно только знать какой-то реляционный порядок частей этой операции, где тот, который занимает больше всего времени, кажется, тот, который вы должны оптимизировать. Поэтому андроид выводит трассировку метода:

 Debug.startMethodTracing("YOUR_TRACE_FILE_NAME"); // Do your operations Debug.stopMethodTracing(); 

Затем os записывает файл трассировки, содержащий все данные вызова в файловую систему. Просто перетащите этот файл на traceview.bat и начните проверять, сколько звонков traceview.bat .

Выгоды:

  • Вы можете проверить все вызываемые функции и методы, которые были вызваны во время трассировки.
  • Нет необходимости синхронизировать данные для многопоточных приложений.
  • Трассировка записывается в файл автоматически – не требуется лог-кошачий магия или что-то еще. Все данные инкапсулированы вместе, готовые к проверке.
  • Как только вы начнете добавлять измерения времени и, особенно, регистрируетесь, вы в любом случае повредите свое время.

Ссылка: http://developer.android.com/tools/debugging/debugging-tracing.html

Если вы просто ищете журналы, как описано в 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

И ты здесь. Счастливое кодирование !!!

Попробуйте сделать:

 adb shell logcat