#java #android
Добрый день.Есть у меня некая привычка логировать всё подряд ,прям каждый шажек в
программе. Может ли это сильно сказаться на производительности программы?
Под логгированием иммею ввиду Log.d()
Ответы
Ответ 1
Конкретных цифр я не нашел (точнее нашел, но источник так себе, там говорится об оверхеде в 0.4%-7.5% потребления батареи при скорости логирования 60КБ/с) Если же исходить из документации, то там можно прочитать такое: The order in terms of verbosity, from least to most is ERROR, WARN, INFO, DEBUG, VERBOSE. Verbose should never be compiled into an application except during development. Debug logs are compiled in but stripped at runtime. Error, warning and info logs are always kept. и еще Tip: Don't forget that when you make a call like Log.v(TAG, "index=" + i); that when you're building the string to pass into Log.d, the compiler uses a StringBuilder and at least three allocations occur: the StringBuilder itself, the buffer, and the String object. Realistically, there is also another buffer allocation and copy, and even more pressure on the gc. That means that if your log message is filtered out, you might be doing significant work and incurring significant overhead. Тут внимания привлекают слова significant overhead (значительные накладные расходы)Ответ 2
Сильно/слабо, - это субъективные оценочные суждения. Сюда следует привнести элемент дифф.диагностики: Можно посмотреть сколько уходит времени на выполнение основных алгоритмов программы. Взять currentTimeMillis() на входе и на выходе, получить разницу. Сделать это с логами и без них. Посмотреть в каком-нибудь диспетчере задач, как работает программа с логами и без них. Прогнать программу через профайлер с логами и без них. Думаю, применив такой подход, ты сможешь увидеть как логирование влияет на производительность.Ответ 3
Конечно влияет. Чтобы исключить влияние избыточных логов на скорость исполнения я обычно делаю так: public static final boolean DEBUG=true; if(DEBUG) { Log.d(TAG, "Blah-blah"); } Когда готовится релиз, переменную DEBUG=false и компилятор уже сам вырежет код вызова логгера вместе с if'ом - можно это даже сделать через скрипты gradle. В общем идея то понятна. В дебаг версии все обложено логами, а в релизной версии ненужные логи вырезаются.
Комментариев нет:
Отправить комментарий