Обнаружение избыточных вызовов функций в дереве стека вызовов с помощью DTrace - PullRequest
1 голос
/ 22 августа 2011

Мне трудно отследить ненужные избыточные вызовы в довольно сложном алгоритме.

Похоже (некоторые из моих), что мой алгоритм (ы) серьезно замедлен из-за избыточных вызовов (в нескольких подпрограммах) не кэшируемой и сравнительно дорогой функции. Чтобы подтвердить это, я хотел бы использовать Dtrace для обнаружения нескольких вызовов одной функции в пределах данной ветви дерева стека вызовов.

Я бы хотел попросить dtrace:

  • поиск в дереве стеков вызовов в данной функции (здесь "foo();", см. Прикрепленное изображение) на предмет дублирования вызовов функций ("c();", например)

  • зарегистрируйте их с соответствующим количеством вызовов (здесь: 3x для "c();")

и, если возможно, также

  • регистрировать стеки вызовов для каждого случая ("foo()/a()/c()", "foo()/a()/b()/c()", "foo()/a()/b()/d()/c()").

Возможно ли это? И если да, есть идеи, как?

Заранее спасибо!

enter image description here

Примечание: я использовал C в своем примере кода, хотя мой код на самом деле в Objective-C, но такого рода вещи должны быть не зависимы от языка, не так ли? Общий подход / идея как минимум.

1 Ответ

1 голос
/ 23 августа 2011

Я использую метод случайная пауза , как в в этом примере . Идея в том, что вы хотите увидеть, это трассировки стека, взвешенные по времени настенных часов, за которое они несут ответственность. Сайты вызова функций, ответственные за значительное время, отображаются преимущественно.

Тогда вы просто посмотрите на них. Следы стека говорят вам, почему они выполняются. Из этого вы можете определить, есть ли способ обойтись без них. Если вы это сделаете, то время, которое вы сэкономите, будет таким же, как доля времени, которое они находились в стеке.

Примечание. Если вы сделаете это, вам не нужно заботиться о том, сколько раз была вызвана функция с этого сайта (или из любого места) или сколько времени потребуется для ее выполнения. Все, что вам нужно, это заботиться о том, чтобы сайт вызовов находился в стеке как минимум на двух выборках и что его можно удалить.

...