From 39459f98e8503ea761d023fbf135ec8694583234 Mon Sep 17 00:00:00 2001 From: Ulf Hermann <ulf.hermann@qt.io> Date: Tue, 21 Feb 2017 10:42:18 +0100 Subject: [PATCH] QmlProfiler: Optimize flame graph model foreach() is slow in hot loops like these. Also, by moving frequently used children to the front we reduce the effort to find them in further iterations. Change-Id: Ib5dceb82511fdd1cb59c50e1ab2485f5035fbef8 Reviewed-by: Milian Wolff <milian.wolff@kdab.com> --- src/plugins/qmlprofiler/flamegraphmodel.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmlprofiler/flamegraphmodel.cpp b/src/plugins/qmlprofiler/flamegraphmodel.cpp index 6d2501a928c..5f5ddb7a6d7 100644 --- a/src/plugins/qmlprofiler/flamegraphmodel.cpp +++ b/src/plugins/qmlprofiler/flamegraphmodel.cpp @@ -136,7 +136,7 @@ void FlameGraphModel::loadEvent(const QmlEvent &event, const QmlEventType &type) void FlameGraphModel::finalize() { - foreach (FlameGraphData *child, m_stackBottom.children) + for (FlameGraphData *child : m_stackBottom.children) m_stackBottom.duration += child->duration; loadNotes(-1, false); @@ -217,9 +217,19 @@ FlameGraphData::~FlameGraphData() FlameGraphData *FlameGraphModel::pushChild(FlameGraphData *parent, const QmlEvent &data) { - foreach (FlameGraphData *child, parent->children) { + QVector<FlameGraphData *> &siblings = parent->children; + + for (auto it = siblings.begin(), end = siblings.end(); it != end; ++it) { + FlameGraphData *child = *it; if (child->typeIndex == data.typeIndex()) { ++child->calls; + for (auto back = it, front = siblings.begin(); back != front;) { + --back; + if ((*back)->calls >= (*it)->calls) + break; + qSwap(*it, *back); + it = back; + } return child; } } -- GitLab