Выполнение временного кода в Android - PullRequest
34 голосов
/ 27 июня 2010

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

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

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

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

Ответы [ 6 ]

57 голосов
/ 28 июня 2010

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

Вы можете включить ведение журнала для этого тега вручную из [Класс 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)

8 голосов
/ 21 мая 2015

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

8 голосов
/ 28 июня 2010

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

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

И вот вы здесь.Удачного кодирования !!!

2 голосов
/ 04 мая 2015

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

Debug.startMethodTracing("YOUR_TRACE_FILE_NAME");

// Do your operations

Debug.stopMethodTracing();

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

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

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

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

adb shell logcat
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...