From 8effe0b632066715216bb88bb7213dd3601426de Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 2 Mar 2020 21:37:19 +0100 Subject: [PATCH] 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.) --- DevTools/ProfileViewer/Profile.cpp | 8 +++++--- DevTools/ProfileViewer/Profile.h | 3 +++ DevTools/ProfileViewer/ProfileModel.cpp | 6 +++++- DevTools/ProfileViewer/ProfileModel.h | 1 + 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/DevTools/ProfileViewer/Profile.cpp b/DevTools/ProfileViewer/Profile.cpp index bc8ce4f2b8814d..07071ecc946d62 100644 --- a/DevTools/ProfileViewer/Profile.cpp +++ b/DevTools/ProfileViewer/Profile.cpp @@ -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(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; }); } diff --git a/DevTools/ProfileViewer/Profile.h b/DevTools/ProfileViewer/Profile.h index 379d08828f4bc2..8d7933c5e00462 100644 --- a/DevTools/ProfileViewer/Profile.h +++ b/DevTools/ProfileViewer/Profile.h @@ -48,6 +48,7 @@ class ProfileNode : public RefCounted { 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>& children() const { return m_children; } @@ -78,6 +79,7 @@ class ProfileNode : public RefCounted { 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 @@ class ProfileNode : public RefCounted { u32 m_address { 0 }; u32 m_offset { 0 }; u32 m_event_count { 0 }; + u32 m_self_count { 0 }; u64 m_timestamp { 0 }; Vector> m_children; }; diff --git a/DevTools/ProfileViewer/ProfileModel.cpp b/DevTools/ProfileViewer/ProfileModel.cpp index 0e4214be4f1fb6..c9f78a23b8205a 100644 --- a/DevTools/ProfileViewer/ProfileModel.cpp +++ b/DevTools/ProfileViewer/ProfileModel.cpp @@ -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 {}; diff --git a/DevTools/ProfileViewer/ProfileModel.h b/DevTools/ProfileViewer/ProfileModel.h index 7898ee9279cf17..ee72911c324966 100644 --- a/DevTools/ProfileViewer/ProfileModel.h +++ b/DevTools/ProfileViewer/ProfileModel.h @@ -39,6 +39,7 @@ class ProfileModel final : public GUI::Model { enum Column { SampleCount, + SelfCount, StackFrame, __Count };