diff --git a/src/libs/qmljsdebugclient/qmlprofilereventlist.cpp b/src/libs/qmljsdebugclient/qmlprofilereventlist.cpp index 10fc09ca12e..a64caa755d1 100644 --- a/src/libs/qmljsdebugclient/qmlprofilereventlist.cpp +++ b/src/libs/qmljsdebugclient/qmlprofilereventlist.cpp @@ -228,6 +228,7 @@ void QmlProfilerEventList::compileStatistics() // maximum possible value eventDescription->minTime = d->m_endTimeSortedList.last().endTime; eventDescription->maxTime = 0; + eventDescription->medianTime = 0; eventDescription->cumulatedDuration = 0; eventDescription->parentList.clear(); eventDescription->childrenList.clear(); @@ -273,6 +274,20 @@ void QmlProfilerEventList::compileStatistics() binding->timePerCall = binding->calls > 0 ? double(binding->cumulatedDuration) / binding->calls : 0; } + // compute median time + QHash < QmlEventData* , QList > durationLists; + foreach (const QmlEventStartTimeData &startData, d->m_startTimeSortedList) { + durationLists[startData.description].append(startData.length); + } + QMutableHashIterator < QmlEventData* , QList > iter(durationLists); + while (iter.hasNext()) { + iter.next(); + if (!iter.value().isEmpty()) { + qSort(iter.value()); + iter.key()->medianTime = iter.value().at(iter.value().count()/2); + } + } + // continue postprocess postProcess(); } diff --git a/src/libs/qmljsdebugclient/qmlprofilereventlist.h b/src/libs/qmljsdebugclient/qmlprofilereventlist.h index d65f8fef6c8..7d8e50760bf 100644 --- a/src/libs/qmljsdebugclient/qmlprofilereventlist.h +++ b/src/libs/qmljsdebugclient/qmlprofilereventlist.h @@ -57,6 +57,7 @@ struct QMLJSDEBUGCLIENT_EXPORT QmlEventData qint64 maxTime; double timePerCall; double percentOfTime; + qint64 medianTime; }; typedef QHash QmlEventHash; diff --git a/src/plugins/qmlprofiler/qmlprofilereventview.cpp b/src/plugins/qmlprofiler/qmlprofilereventview.cpp index e3dcedd8b0d..a9ee3a1a63f 100644 --- a/src/plugins/qmlprofiler/qmlprofilereventview.cpp +++ b/src/plugins/qmlprofiler/qmlprofilereventview.cpp @@ -165,6 +165,7 @@ void QmlProfilerEventsView::setViewType(ViewTypes type) setFieldViewable(TimePerCall, true); setFieldViewable(MaxTime, true); setFieldViewable(MinTime, true); + setFieldViewable(MedianTime, true); setFieldViewable(Details, false); setFieldViewable(Parents, false); setFieldViewable(Children, false); @@ -181,6 +182,7 @@ void QmlProfilerEventsView::setViewType(ViewTypes type) setFieldViewable(TimePerCall, false); setFieldViewable(MaxTime, false); setFieldViewable(MinTime, false); + setFieldViewable(MedianTime, false); setFieldViewable(Details, true); setFieldViewable(Parents, true); setFieldViewable(Children, false); @@ -197,6 +199,7 @@ void QmlProfilerEventsView::setViewType(ViewTypes type) setFieldViewable(TimePerCall, false); setFieldViewable(MaxTime, false); setFieldViewable(MinTime, false); + setFieldViewable(MedianTime, false); setFieldViewable(Details, true); setFieldViewable(Parents, false); setFieldViewable(Children, true); @@ -234,7 +237,9 @@ void QmlProfilerEventsView::setHeaderLabels() if (d->m_fieldShown[CallCount]) d->m_model->setHeaderData(fieldIndex++, Qt::Horizontal, QVariant(tr("Calls"))); if (d->m_fieldShown[TimePerCall]) - d->m_model->setHeaderData(fieldIndex++, Qt::Horizontal, QVariant(tr("Time per Call"))); + d->m_model->setHeaderData(fieldIndex++, Qt::Horizontal, QVariant(tr("Mean Time"))); + if (d->m_fieldShown[MedianTime]) + d->m_model->setHeaderData(fieldIndex++, Qt::Horizontal, QVariant(tr("Median Time"))); if (d->m_fieldShown[MaxTime]) d->m_model->setHeaderData(fieldIndex++, Qt::Horizontal, QVariant(tr("Longest Time"))); if (d->m_fieldShown[MinTime]) @@ -324,6 +329,11 @@ void QmlProfilerEventsView::QmlProfilerEventsViewPrivate::buildModelFromList( co newRow.last()->setData(QVariant(binding->timePerCall)); } + if (m_fieldShown[MedianTime]) { + newRow << new EventsViewItem(displayTime(binding->medianTime)); + newRow.last()->setData(QVariant(binding->medianTime)); + } + if (m_fieldShown[MaxTime]) { newRow << new EventsViewItem(displayTime(binding->maxTime)); newRow.last()->setData(QVariant(binding->maxTime)); @@ -339,6 +349,8 @@ void QmlProfilerEventsView::QmlProfilerEventsViewPrivate::buildModelFromList( co newRow.last()->setData(QVariant(binding->details)); } + + if (!newRow.isEmpty()) { // no edit foreach (QStandardItem *item, newRow) diff --git a/src/plugins/qmlprofiler/qmlprofilereventview.h b/src/plugins/qmlprofiler/qmlprofilereventview.h index 28ba21484e1..7a7e16f3318 100644 --- a/src/plugins/qmlprofiler/qmlprofilereventview.h +++ b/src/plugins/qmlprofiler/qmlprofilereventview.h @@ -62,6 +62,7 @@ public: TimePerCall, MaxTime, MinTime, + MedianTime, Details, Parents, Children,