Смотрите, я быстро попробовал, добавил точку останова и получил обратный вызов во фрагменте.
val builder = android.support.v7.app.AlertDialog.Builder(context)
вместо активности
val builder = android.support.v7.app.AlertDialog.Builder(activity)
Это может не дать прямого ответа на ваш вопрос, но определенно поможет. Если использовать профилировщик с опцией --sort cumulative, он сортирует функции по совокупному времени. Это полезно для обнаружения не только тяжелых функций, но и функций, которые их вызывают.
python -m cProfile --sort cumulative myScript.py
Существует обходной путь для получения функции вызывающего абонента:
import inspect
print inspect.getframeinfo(inspect.currentframe().f_back)[2]
Вы можете добавить столько f_back, сколько хотите, на случай, если вам нужен вызывающий вызывающий объект и т. Д. Если вы хотите подсчитать частые вызовы, вы можете сделать это:
record = {}
caller = inspect.getframeinfo(inspect.currentframe().f_back)[2]
record[caller] = record.get(caller, 0) + 1
Затем распечатать их в порядке частоты:
print sorted(record.items(), key=lambda a: a[1])
Я сам не использовал cProfile, но большинство профилировщиков звонят вам иерархия.
Погуглив, я нашел эти слайды о cProfile. Может, это поможет. Страница 6 выглядит так, будто cProfile предоставляет иерархию.
Я почти всегда просматриваю вывод модуля cProfile, используя Gprof2dot , в основном он преобразует выходные данные в график graphvis (файл .dot
), например:
Это позволяет очень легко определить, какая функция самая медленная и какая функция [ы] вызвала ее.
Использование:
python -m cProfile -o output.pstats path/to/your/script arg1 arg2
gprof2dot.py -f pstats output.pstats | dot -Tpng -o output.png
inspect.stack () даст вам текущий стек вызывающего абонента.
Извините, я не знаком с Python, но есть общий метод , который работает, предполагая, что вы можете вручную прервать выполнение в случайное время.
Просто сделайте это. , и отобразить стек вызовов. Он с большой долей вероятности скажет вам то, что вы хотите знать. Если вы хотите быть более уверенными, просто сделайте это несколько раз.
Это работает, потому что виновный вызывающий должен находиться в стеке вызовов в течение той части времени, которое тратится впустую, что открывает его для ваших прерываний на протяжении большей части времени. время, независимо от того, распространяется ли он на множество коротких вызовов или несколько длительных.
ПРИМЕЧАНИЕ: Этот процесс больше похож на диагностику, чем на измерение. Предположим, что плохой вызов тратит 90% времени. Тогда каждый раз, когда вы его останавливаете, вероятность того, что неверный оператор вызова находится прямо там в стеке вызовов, чтобы вы могли видеть, составляет 90%, и вы увидите, что это плохо. Однако, если вы хотите точно измерить потери, это другая проблема. Для этого вам понадобится намного больше образцов, чтобы увидеть, какой% из них содержит этот вызов. Или, в качестве альтернативы, просто исправьте виновный вызов, измерьте ускорение, и это точно скажет вам, какие были потери.