Как интерпретировать графики Kcachegrind?
Я начал использовать Kcachegrind
для анализа производительности. Но я не понимаю GUI
и выходные графики.
Например, для этого графа вызовов
SignatureIterator::iterate_parameters()
Я не понимаю, на что ссылаются 9,25%? 5 198x означает, сколько раз SignatureIterator::iterate_parameters()
называется SignatureIterator::parse_type()
? Что означает 100% в Symbol::byte_at(int) const
? Что такое ELF Object
?
Примечание: в официальной документации http://kcachegrind.sourceforge.net/html/CallGraph.html, но до сих пор не понимаю, что такое the caller distance to the function
?
1 ответ
Все визуализации в KCachegrind сосредоточены вокруг текущей выбранной функции, которая Symbol::byte_at()
Вот. Обычно, процентное значение выбранной функции отображается по отношению к общей стоимости (время выполнения / циклы, что когда-либо). Однако, если вы включите кнопку режима / инструмента "Относительно родителя", процентные числа на графике вызовов будут "увеличены", чтобы показать 100% для выбранной функции, чтобы упростить просмотр соотношений затрат, потраченных на другие функции. относительно выбранного.
Давайте предположим, что стоимость (т. Е. Тип события, выбранный в KCachegrind) равна времени (в циклах ЦП или миллисекундах - не имеет значения в процентах). Это облегчает понимание.
Проценты на графиках вызовов всегда показывают время, затраченное на какую-то данную функцию, в то время как выбранная функция (Symbol::byte_at
) была активна, т.е. время, когда обе функции могут быть найдены в стеке вызовов во время выполнения программы. Это работает как в направлении вызываемого абонента (вниз Symbol::byte_at()
) и направление звонящего (вверх Symbol::byte_at()
).
Вниз это легче понять: пока Symbol::byte_at()
был активен, 24,14% того времени процессор фактически выполнял код из Symbol::base()
, В другое время (100% - 24,14%), код из Symbol::byte_at()
сам бежал.
Вверх от выбранной функции, это может быть немного сложнее. Например, 9,25% для SignatureIterator::iterate_parameters()
означает, что во время Symbol::byte_at()
был активен, 9,25% того времени его косвенно вызывали из SignatureIterator::iterate_parameters()
, Так же, Symbol::byte_at()
был вызван 11,27% времени, когда он работал прямо из SignatureIterator::parse_type()
, То есть, в процентах от выбранной функции проценты в прямых родителях функции всегда складываются с точным процентом этой функции, если только функция не была исключена из визуализации из-за того, что она ниже порога видимости (см. Контекстное меню).