graphicsview: use std::sort instead of qSort

In almost all cases, std::sort is wildly faster than qSort - but especially in
the case where the input data is already sorted. in some stress tests which ran
through the index with a lot of items, this commit provides huge speedup (684ms
down to 10ms for painting 15001 empty items on the provided benchmark), for me.

Task-number: QTBUG-11022
Change-Id: I5551f8e320c33ba13d464bf22047a665c81f3b74
Reviewed-by: Peter Kümmel <syntheticpp@gmx.net>
Reviewed-by: João Abecasis <joao.abecasis@nokia.com>
This commit is contained in:
Robin Burchell 2012-09-02 12:18:14 +02:00 committed by Qt by Nokia
parent ce2a8bdc13
commit 8486a510d5
5 changed files with 15 additions and 15 deletions

View File

@ -4578,7 +4578,7 @@ void QGraphicsItem::setZValue(qreal z)
void QGraphicsItemPrivate::ensureSequentialSiblingIndex()
{
if (!sequentialOrdering) {
qSort(children.begin(), children.end(), insertionOrder);
std::sort(children.begin(), children.end(), insertionOrder);
sequentialOrdering = 1;
needSortChildren = 1;
}

View File

@ -826,7 +826,7 @@ inline void QGraphicsItemPrivate::ensureSortedChildren()
sequentialOrdering = 1;
if (children.isEmpty())
return;
qSort(children.begin(), children.end(), qt_notclosestLeaf);
std::sort(children.begin(), children.end(), qt_notclosestLeaf);
for (int i = 0; i < children.size(); ++i) {
if (children.at(i)->d_ptr->siblingIndex != i) {
sequentialOrdering = 0;

View File

@ -1465,7 +1465,7 @@ void QGraphicsScenePrivate::mousePressEventHandler(QGraphicsSceneMouseEvent *mou
void QGraphicsScenePrivate::ensureSequentialTopLevelSiblingIndexes()
{
if (!topLevelSequentialOrdering) {
qSort(topLevelItems.begin(), topLevelItems.end(), QGraphicsItemPrivate::insertionOrder);
std::sort(topLevelItems.begin(), topLevelItems.end(), QGraphicsItemPrivate::insertionOrder);
topLevelSequentialOrdering = true;
needSortTopLevelItems = 1;
}
@ -6055,7 +6055,7 @@ void QGraphicsScenePrivate::gestureEventHandler(QGestureEvent *event)
gestureTargetsAtHotSpots(startedGestures, Qt::GestureFlag(0), &cachedItemGestures, 0,
&normalGestures, &conflictedGestures);
cachedTargetItems = cachedItemGestures.keys();
qSort(cachedTargetItems.begin(), cachedTargetItems.end(), qt_closestItemFirst);
std::sort(cachedTargetItems.begin(), cachedTargetItems.end(), qt_closestItemFirst);
DEBUG() << "QGraphicsScenePrivate::gestureEventHandler:"
<< "Normal gestures:" << normalGestures
<< "Conflicting gestures:" << conflictedGestures;
@ -6148,7 +6148,7 @@ void QGraphicsScenePrivate::gestureEventHandler(QGestureEvent *event)
<< gesture->hotSpot() << gesture->d_func()->sceneHotSpot;
}
}
qSort(cachedTargetItems.begin(), cachedTargetItems.end(), qt_closestItemFirst);
std::sort(cachedTargetItems.begin(), cachedTargetItems.end(), qt_closestItemFirst);
for (int i = 0; i < cachedTargetItems.size(); ++i) {
QPointer<QGraphicsObject> receiver = cachedTargetItems.at(i);
QSet<QGesture *> gestures =
@ -6228,7 +6228,7 @@ void QGraphicsScenePrivate::gestureEventHandler(QGestureEvent *event)
&cachedItemGestures, &targetsSet, 0, 0);
cachedTargetItems = targetsSet.toList();
qSort(cachedTargetItems.begin(), cachedTargetItems.end(), qt_closestItemFirst);
std::sort(cachedTargetItems.begin(), cachedTargetItems.end(), qt_closestItemFirst);
DEBUG() << "QGraphicsScenePrivate::gestureEventHandler:"
<< "new targets:" << cachedTargetItems;
i = -1; // start delivery again

View File

@ -271,7 +271,7 @@ public:
inline void ensureSortedTopLevelItems()
{
if (needSortTopLevelItems) {
qSort(topLevelItems.begin(), topLevelItems.end(), qt_notclosestLeaf);
std::sort(topLevelItems.begin(), topLevelItems.end(), qt_notclosestLeaf);
topLevelSequentialOrdering = false;
needSortTopLevelItems = false;
}

View File

@ -243,7 +243,7 @@ void QGraphicsSceneBspTreeIndexPrivate::climbTree(QGraphicsItem *item, int *stac
{
if (!item->d_ptr->children.isEmpty()) {
QList<QGraphicsItem *> childList = item->d_ptr->children;
qSort(childList.begin(), childList.end(), qt_closestLeaf);
std::sort(childList.begin(), childList.end(), qt_closestLeaf);
for (int i = 0; i < childList.size(); ++i) {
QGraphicsItem *item = childList.at(i);
if (!(item->flags() & QGraphicsItem::ItemStacksBehindParent))
@ -282,7 +282,7 @@ void QGraphicsSceneBspTreeIndexPrivate::_q_updateSortCache()
topLevels << item;
}
qSort(topLevels.begin(), topLevels.end(), qt_closestLeaf);
std::sort(topLevels.begin(), topLevels.end(), qt_closestLeaf);
for (int i = 0; i < topLevels.size(); ++i)
climbTree(topLevels.at(i), &stackingOrder);
}
@ -417,23 +417,23 @@ void QGraphicsSceneBspTreeIndexPrivate::sortItems(QList<QGraphicsItem *> *itemLi
if (onlyTopLevelItems) {
if (order == Qt::DescendingOrder)
qSort(itemList->begin(), itemList->end(), qt_closestLeaf);
std::sort(itemList->begin(), itemList->end(), qt_closestLeaf);
else if (order == Qt::AscendingOrder)
qSort(itemList->begin(), itemList->end(), qt_notclosestLeaf);
std::sort(itemList->begin(), itemList->end(), qt_notclosestLeaf);
return;
}
if (sortCacheEnabled) {
if (order == Qt::DescendingOrder) {
qSort(itemList->begin(), itemList->end(), closestItemFirst_withCache);
std::sort(itemList->begin(), itemList->end(), closestItemFirst_withCache);
} else if (order == Qt::AscendingOrder) {
qSort(itemList->begin(), itemList->end(), closestItemLast_withCache);
std::sort(itemList->begin(), itemList->end(), closestItemLast_withCache);
}
} else {
if (order == Qt::DescendingOrder) {
qSort(itemList->begin(), itemList->end(), qt_closestItemFirst);
std::sort(itemList->begin(), itemList->end(), qt_closestItemFirst);
} else if (order == Qt::AscendingOrder) {
qSort(itemList->begin(), itemList->end(), qt_closestItemLast);
std::sort(itemList->begin(), itemList->end(), qt_closestItemLast);
}
}
}