Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Если вы, ребята, посмотрите на исходный код, на самом деле реализация для 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.

Ответ 4

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

Debug.startMethodTracing("YOUR_TRACE_FILE_NAME");

// Do your operations

Debug.stopMethodTracing();

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

Преимущества:

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

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

Ответ 5

Если вы просто ищете журналы, как описано в developer.android.com, вы не сможете увидеть журналы. Поэтому используйте команду ниже:

  • adb shell setprop log.tag.MyTag VERBOSE

Примечание: MyTag - это первый параметр, который вы передали при создании нового TimingLogger, как показано ниже:

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

Для ответа на ваши вопросы вы должны выполнить команду: adb shell setprop log.tag.TopicLogTag VERBOSE

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

Ответ 6

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

adb shell logcat