┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/kitemviews
diff options
context:
space:
mode:
authorFrank Reininghaus <[email protected]>2013-10-30 17:48:32 +0100
committerFrank Reininghaus <[email protected]>2013-10-30 17:48:42 +0100
commit903381a8982a0aefc7b1eba223f9ee38ded3f018 (patch)
tree3fb72e79f8a74b4edccba2f72f35250a5a39b098 /src/kitemviews
parente518cea0cf91056fe7ff391b916623fb0654dff4 (diff)
Sort in items in two stages to speed up natural sorting
Sort the items in a folder first according to their name, without doing a natural/locale-aware sorting. This is very fast, but the order of the items is then already close to the final order in most cases. The number of expensive natural comparisons required to sort the items is thus greatly reduced. In my experiments with a folder with 100,000 items, the time required to sort the files was reduced by 63% with this patch. REVIEW: 113485
Diffstat (limited to 'src/kitemviews')
-rw-r--r--src/kitemviews/kfileitemmodel.cpp8
-rw-r--r--src/kitemviews/kfileitemmodel.h12
2 files changed, 20 insertions, 0 deletions
diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp
index f21edbf4a..e2d0413a2 100644
--- a/src/kitemviews/kfileitemmodel.cpp
+++ b/src/kitemviews/kfileitemmodel.cpp
@@ -1036,6 +1036,14 @@ void KFileItemModel::insertItems(QList<ItemData*>& newItems)
m_groups.clear();
+ if (m_naturalSorting) {
+ // Natural sorting of items can be very slow. However, it becomes much
+ // faster if the input sequence is already mostly sorted. Therefore, we
+ // first sort 'newItems' according to the QStrings returned by
+ // KFileItem::text() using QString::operator<(), which is quite fast.
+ parallelMergeSort(newItems.begin(), newItems.end(), nameLessThan, QThread::idealThreadCount());
+ }
+
sort(newItems.begin(), newItems.end());
#ifdef KFILEITEMMODEL_DEBUG
diff --git a/src/kitemviews/kfileitemmodel.h b/src/kitemviews/kfileitemmodel.h
index d00570549..4b50477d9 100644
--- a/src/kitemviews/kfileitemmodel.h
+++ b/src/kitemviews/kfileitemmodel.h
@@ -350,6 +350,12 @@ private:
QHash<QByteArray, QVariant> retrieveData(const KFileItem& item, const ItemData* parent) const;
/**
+ * @return True if \a a has a KFileItem whose text is 'less than' the one
+ * of \a b according to QString::operator<(const QString&).
+ */
+ static bool nameLessThan(const ItemData* a, const ItemData* b);
+
+ /**
* @return True if the item-data \a a should be ordered before the item-data
* \b. The item-data may have different parent-items.
*/
@@ -485,6 +491,12 @@ private:
friend class DolphinPart; // Accesses m_dirLister
};
+inline bool KFileItemModel::nameLessThan(const ItemData* a, const ItemData* b)
+{
+ return a->item.text() < b->item.text();
+}
+
+
inline bool KFileItemModel::isChildItem(int index) const
{
if (m_itemData.at(index)->parent) {