ОК, я полагаю, ваша реальная цель - сделать ваш код максимально быстрым, верно?
Естественно предположить, что вы делаете это, выясняя, сколько времени занимают ваши функции, но есть и другой способ посмотреть на это.
Учтите, что когда ваша программа запускается, она отслеживает дерево вызовов, которое похоже на реальное дерево за пределами вашего окна. Магистраль похожа на функцию main
, и когда любая ветвь отделяется от нее, это как вызов другой функции.
Предположим, что каждый "лист" занимает определенное время, и вы хотите обрезать дерево , чтобы удалить как можно больше листьев.
Один из способов - найти ветки с большим количеством листьев и отрезать их. Другой способ - отрезать целые ветви, если они вам не нужны. Проблема в том, чтобы найти тяжелые ветви, которые вам не нужны.
Один простой для этого способ сделать это - выбрать несколько листьев случайным образом, например, 10, и на каждом из них провести линию вниз по ее ветви до самого ствола. Любая точка ветвления будет иметь некоторое количество этих линий, проходящих через нее от листа к стволу. Чем больше линий проходит через эту точку ветвления, тем больше листьев на этой ветви, и тем больше вы можете сэкономить, обрезав ее.
Вот как вы можете применить это к своей программе. Чтобы сэмплировать лист, вы останавливаете программу наугад и смотрите на стек вызовов. Это линия обратно в багажник. Каждый сайт вызова на нем (не функция, сайт вызова) является точкой ветвления. Если этот сайт вызовов находится на некоторой доле выборок, например 40%, то это примерно столько, сколько вы могли бы сэкономить, обрезав его.
Так что не думайте об этом, как об измерении того, сколько времени занимают функции. Думайте об этом, как вопрос о том, какие сайты вызовов являются «тяжелыми». Вот и все, что нужно.