aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/qmlprofiler
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2017-02-21 10:42:18 +0100
committerUlf Hermann <ulf.hermann@qt.io>2017-02-21 15:16:18 +0000
commit39459f98e8503ea761d023fbf135ec8694583234 (patch)
tree4b20704e936c83acb601d85062178101f4260b4c /src/plugins/qmlprofiler
parent7e8591c01738ff37ee4042dd6c2c2f43014875e4 (diff)
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>
Diffstat (limited to 'src/plugins/qmlprofiler')
-rw-r--r--src/plugins/qmlprofiler/flamegraphmodel.cpp14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/plugins/qmlprofiler/flamegraphmodel.cpp b/src/plugins/qmlprofiler/flamegraphmodel.cpp
index 6d2501a928..5f5ddb7a6d 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;
}
}