Раньше я думал, что создание объектов во время выполнения будет лучшим подходом. Теперь я менее уверен, так как вы теряете некоторые полезные функции, хотя это может стоить того, что было бы просто для предотвращения путаницы новичков. Недостатками этого являются:
1. Производительность
def foo(arg=something_expensive_to_compute())):
...
Если используется оценка времени вызова, тогда дорогая функция вызывается каждый раз, когда ваша функция используется без аргумента. Вы либо заплатили бы дорогостоящую цену за каждый вызов, либо должны вручную кэшировать значение извне, загрязняя пространство имен и добавляя многословие.
2. Принудительные связанные параметры
Полезный трюк заключается в привязке параметров лямбда к привязке current переменной при создании лямбда. Например:
funcs = [ lambda i=i: i for i in range(10)]
Возвращает список функций, возвращающих 0,1,2,3 ... соответственно. Если поведение изменено, они вместо этого привяжут i
к значению времени вызова для i, поэтому вы получите список функций, которые все вернули 9
.
Единственным способом реализации этого в противном случае было бы создать дальнейшее закрытие с привязкой i, то есть:
def make_func(i): return lambda: i
funcs = [make_func(i) for i in range(10)]
3. Introspection
Рассмотрим код:
def foo(a='test', b=100, c=[]):
print a,b,c
Мы можем получить информацию о аргументах и значениях по умолчанию с помощью модуля inspect
, который
>>> inspect.getargspec(foo)
(['a', 'b', 'c'], None, None, ('test', 100, []))
информация очень полезна для таких вещей, как создание документов, метапрограммирование, декораторы и т. д.
Теперь предположим, что поведение по умолчанию может быть изменено так, что это эквивалентно:
_undefined = object() # sentinel value
def foo(a=_undefined, b=_undefined, c=_undefined)
if a is _undefined: a='test'
if b is _undefined: b=100
if c is _undefined: c=[]
Однако мы потеряли способность интроспекции и посмотрим, какие аргументы по умолчанию равны . Поскольку объекты не были построены, мы никогда не сможем их захватить, не называя функцию. Самое лучшее, что мы могли бы сделать, это сохранить исходный код и вернуть его как строку.
На практике я считаю, что большинство приложений, которые имеют проблемы с питанием, также имеют проблемы с процессором. То есть профиль использования вашего приложения в качестве процессора, вероятно, является хорошим приближением к потреблению вашего аккумулятора. Есть предостережения и исключения, если, например, ваше приложение делает что-то дорогое с графическим процессором, беспроводной сетью, хранилищем и т. Д., А дорогостоящая операция не требует большого времени процессора.
Вот интересный блог о приложении «Power Tutor», который обеспечивает более точное измерение в работающей системе, чем встроенное приложение для батареи: http://gigaom.com/mobile/android-power-consumption-app/ . Я еще не пробовал.
Для другого уровня детализации, вот документ, который разбивает, какие компоненты телефона сосут наибольшее количество сока (обратите внимание, что бумага с 2010 года): http: //www.usenix.org/event/usenix10/tech/full_papers/Carroll.pdf (просто перейдите к разделу 5, чтобы прочитать их результаты). Они говорят, что яркость экрана является самым большим виновником.
Если яркость экрана является самым большим виновником, обязательно установите ее на фиксированный уровень, если вы измеряете использование своего собственного приложения.
Если вы действительно заинтересованы в измерении энергопотребления, вы можете следовать их методологии (которая вызывает открытие телефона и физическое присоединение измерительных устройств.)
Вопрос, который вы задали, является предметом исследования прямо сейчас. Существует несколько исследований, посвященных трассировке мелкозернистого энергопотребления, т. Е. Использованию мощности трассировки по потоку или подпрограмме. \
eprof - это один из инструментов, разработанных некоторыми университетскими градациями.
вы можете найти некоторые статьи по этой теме: http://web.ics.purdue.edu/~pathaka/pubs.html
Я работаю над одним и тем же, я обязательно уведомить вас, если что-то пригодное для обычных пользователей.
Начиная с Android 2.3.3 система имеет собственный монитор батареи.
Настройки -> О телефоне -> Использование аккумулятора
Появился новый инструмент, который поставляется с Android 5.0.
Вы можете запустить
adb shell dumpsys batterystats > dump.txt
. Чтобы получить полный сброс батареи вашего устройства. Вы также можете добавить некоторые параметры, такие как --unplugged
(только выходные данные с момента последнего отсоединения) или --charged
(только выходные данные с момента последнего заряда). Вы также можете добавить имя пакета, чтобы получать информацию только для этого пакета / приложения:
adb shell dumpsys batterystats --unplugged your.package.name > dump.txt
Часть > dump.txt
помещает все в файл (возможно, просто работает в Windows, но не уверен. Но вы можете просто оставьте это, дамп будет напечатан прямо на консоли, где вы можете скопировать его и поместить в файл).
Это работает, только если у вас есть устройство с Android 5.x. Если у вас есть устройство с более низким уровнем, вы можете попытаться использовать
adb shell bugreport > bugreport.txt
Но этот файл будет очень большим. (~ 8mb +)
После создания этого файла вы можете использовать Historian Tool для Google
. Чтобы использовать его, вы должны установить Python 2.7.9 и запустить следующая команда
python /path/to/historian.py dump.txt > battery.html
Это создаст файл battery.html, в котором вы сможете увидеть данные в более удобном форматировании.
Последняя вещь: Если вы хотите сбросить статистику дамп батареи просто вызывает
adb shell dumpsys batterystats --reset
(работает только с Android 5.x)
Мы провели аналогичное тестирование, чтобы узнать, как мое приложение отвечает за потребление батареи телефона Nexus5.
Но, к сожалению, мы не смогли получить помощь от какого-либо инструмента, но в основном это было основано на ручном тестировании.
Мы идентифицировали некоторые модули в приложении, которые были заподозрены в увеличении потребления батареи.
Наконец, после 3-4 раунда тестирования у нас была определенная тенденция в данных, и мы смогли идентифицировать модуль, который был большим виновником потребления батареи.
В основном будет больше потребления батареи, если что-то удержит процессор больше времени. Таким образом, мы можем думать о модуле, который имеет фоновые операции, связанные с сетью операции.
На данный момент я не могу найти инструмент, который мог бы сказать выше результата тестирования в определенном приложении.
Hope мой опыт был бы полезен для заявления о требованиях в исходном вопросе.
Я бы сказал, что нет реального инструмента для его проверки, поскольку он не может быть точно определен. Если вы возьмете iPhone, вы увидите, что количество батареек будет идти от 40% до 30%, а затем оставайтесь там на некоторое время, опускайтесь до 20%, снижайтесь до 15%, доходите до 25%, возвращайтесь к 20% ECT , Что вы можете сделать, это зарядить телефон в течение длительного периода времени, чтобы убедиться, что он полностью заряжен, а затем используйте ваше приложение, пока телефон не закроется, и не запомните количество времени, которое потребовалось. Теперь сделайте это с другой версией и посмотрите результат. В основном вам придется играть в игру MasterMind, если вы хотите сделать меньше тестов, насколько это возможно. Кроме того, если изменение не так просто, это, вероятно, не очень важно.