ProfileView: Show "self" sample counts in profiles

The "self" sample count is the number of samples that had this specific
frame as its innermost stack frame (leaf nodes in the profile tree.)
This commit is contained in:
Andreas Kling 2020-03-02 21:37:19 +01:00
parent 8e8e8c801c
commit 8effe0b632
4 changed files with 14 additions and 4 deletions

View file

@ -117,18 +117,18 @@ void Profile::rebuild_tree()
{
if (!m_inverted) {
for (size_t i = 0; i < event.frames.size(); ++i) {
if (callback(event.frames.at(i)) == IterationDecision::Break)
if (callback(event.frames.at(i), i == event.frames.size() - 1) == IterationDecision::Break)
break;
}
} else {
for (ssize_t i = event.frames.size() - 1; i >= 0; --i) {
if (callback(event.frames.at(i)) == IterationDecision::Break)
if (callback(event.frames.at(i), static_cast<size_t>(i) == event.frames.size() - 1) == IterationDecision::Break)
break;
}
}
};
for_each_frame([&](const Frame& frame) {
for_each_frame([&](const Frame& frame, bool is_innermost_frame) {
auto& symbol = frame.symbol;
auto& address = frame.address;
auto& offset = frame.offset;
@ -142,6 +142,8 @@ void Profile::rebuild_tree()
node = &node->find_or_create_child(symbol, address, offset, event.timestamp);
node->increment_event_count();
if (is_innermost_frame)
node->increment_self_count();
return IterationDecision::Continue;
});
}

View file

@ -48,6 +48,7 @@ public:
u64 timestamp() const { return m_timestamp; }
u32 event_count() const { return m_event_count; }
u32 self_count() const { return m_self_count; }
int child_count() const { return m_children.size(); }
const Vector<NonnullRefPtr<ProfileNode>>& children() const { return m_children; }
@ -78,6 +79,7 @@ public:
const ProfileNode* parent() const { return m_parent; }
void increment_event_count() { ++m_event_count; }
void increment_self_count() { ++m_self_count; }
void sort_children();
@ -95,6 +97,7 @@ private:
u32 m_address { 0 };
u32 m_offset { 0 };
u32 m_event_count { 0 };
u32 m_self_count { 0 };
u64 m_timestamp { 0 };
Vector<NonnullRefPtr<ProfileNode>> m_children;
};

View file

@ -98,6 +98,8 @@ String ProfileModel::column_name(int column) const
switch (column) {
case Column::SampleCount:
return "# Samples";
case Column::SelfCount:
return "# Self";
case Column::StackFrame:
return "Stack Frame";
default:
@ -108,7 +110,7 @@ String ProfileModel::column_name(int column) const
GUI::Model::ColumnMetadata ProfileModel::column_metadata(int column) const
{
if (column == Column::SampleCount)
if (column == Column::SampleCount || column == Column::SelfCount)
return ColumnMetadata { 0, Gfx::TextAlignment::CenterRight };
return {};
}
@ -127,6 +129,8 @@ GUI::Variant ProfileModel::data(const GUI::ModelIndex& index, Role role) const
if (role == Role::Display) {
if (index.column() == Column::SampleCount)
return node->event_count();
if (index.column() == Column::SelfCount)
return node->self_count();
if (index.column() == Column::StackFrame)
return node->symbol();
return {};

View file

@ -39,6 +39,7 @@ public:
enum Column {
SampleCount,
SelfCount,
StackFrame,
__Count
};