From e69d3489751ea15c0477fe1d41fcc252c775d377 Mon Sep 17 00:00:00 2001 From: Frank Reininghaus Date: Thu, 7 May 2015 21:09:01 +0100 Subject: [PATCH] Fix KFileItemModel performance regression Commit 119f7a3f fixed a crash that was caused by the porting of the natural sorting code to QCollator. QCollator is not thread-safe, so every thread needs its own instance. However, that commit made every recursive call in the sorting code create a new deep-copied QCollator instance, which is quite expensive and thus made inserting any items into the model very slow (this could also be seen in the KFileItemModel benchmark). This commit avoids unnecessary QCollator copying by forcing all sorting functions which are called in the same thread to pass the 'lessThan' object by const reference, such that no unnecessary copying of that object, including a deep copy of the QCollator, takes place. REVIEW: 123620 --- src/kitemviews/private/kfileitemmodelsortalgorithm.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/kitemviews/private/kfileitemmodelsortalgorithm.h b/src/kitemviews/private/kfileitemmodelsortalgorithm.h index 50db9900d..7c090db91 100644 --- a/src/kitemviews/private/kfileitemmodelsortalgorithm.h +++ b/src/kitemviews/private/kfileitemmodelsortalgorithm.h @@ -37,7 +37,7 @@ template static void mergeSort(RandomAccessIterator begin, RandomAccessIterator end, - LessThan lessThan) + const LessThan& lessThan) { // The implementation is based on qStableSortHelper() from qalgorithms.h // Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). @@ -99,7 +99,7 @@ template static void merge(RandomAccessIterator begin, RandomAccessIterator pivot, RandomAccessIterator end, - LessThan lessThan) + const LessThan& lessThan) { // The implementation is based on qMerge() from qalgorithms.h // Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). @@ -124,12 +124,14 @@ static void merge(RandomAccessIterator begin, if (len1 > len2) { const int len1Half = len1 / 2; firstCut = begin + len1Half; - secondCut = std::lower_bound(pivot, end, *firstCut, lessThan); + secondCut = std::lower_bound(pivot, end, *firstCut, lessThan); len2Half = secondCut - pivot; } else { len2Half = len2 / 2; secondCut = pivot + len2Half; - firstCut = std::upper_bound(begin, pivot, *secondCut, lessThan); + firstCut = std::upper_bound(begin, pivot, *secondCut, lessThan); } std::rotate(firstCut, pivot, secondCut); -- 2.47.3