Обнаружение избыточных вызовов функций в дереве стека вызовов с помощью DTrace
Мне трудно отследить ненужные избыточные вызовы в довольно сложном алгоритме.
Похоже, что (некоторые из моих) мои алгоритмы серьезно тормозятся из-за избыточных вызовов (в нескольких подпрограммах) не кэшируемой и сравнительно дорогой функции. Чтобы подтвердить это, я хотел бы использовать Dtrace для обнаружения нескольких вызовов одной функции в пределах данной ветви дерева стека вызовов.
Я бы хотел попросить dtrace:
поиск в дереве стеков вызовов в заданной функции (здесь
"foo();"
см. прикрепленное изображение) для дублирования вызовов функций ("c();"
напримервойти их с их соответствующим счетчиком вызовов (здесь: 3x для
"c();"
)
и, если возможно, также
- регистрировать стеки вызовов каждого вхождения (
"foo()/a()/c()"
,"foo()/a()/b()/c()"
,"foo()/a()/b()/d()/c()"
).
Это возможно? И если да, есть идеи, как?
Заранее спасибо!
Примечание. Я использовал C в своем примере кода, хотя мой код на самом деле написан на Objective-C, но такого рода вещи должны быть независимыми от языка, не так ли? Общий подход / идея как минимум.
1 ответ
Метод, который я использую, является случайной паузой, как в этом примере. Идея в том, что вы хотите увидеть, это трассировки стека, взвешенные по времени настенных часов, за которое они несут ответственность. Сайты вызова функций, ответственные за значительное время, отображаются преимущественно.
Тогда вы просто посмотрите на них. Следы стека говорят вам, почему они выполняются. Из этого вы можете определить, есть ли способ обойтись без них. Если вы сделаете это, то время, которое вы сэкономите, будет таким же, как доля времени, которое они находились в стеке.
Примечание. Если вы сделаете это, вам не нужно заботиться о том, сколько раз была вызвана функция с этого сайта (или из любого места) или сколько времени требуется для ее выполнения. Все, что вам нужно, это заботиться о том, чтобы сайт вызовов был в стеке как минимум на двух выборках и что его можно удалить.