diff options
| author | Emmanuel Pescosta <[email protected]> | 2012-10-28 17:58:06 +0100 |
|---|---|---|
| committer | Emmanuel Pescosta <[email protected]> | 2012-10-28 17:58:06 +0100 |
| commit | b4800d794ce2f900f64decdf4974cd3edffe9b67 (patch) | |
| tree | c4640e84294e2e21f2da392efe164ee991de1bbc /src | |
| parent | c1bc83dfdb27b61dbd558ef21e81659f563dae81 (diff) | |
Implemented multithreading in KFileItemModelSortAlgorithm. Use as many threads as possible.
Thanks to Frank Reininghaus for all his suggestions.
REVIEW: 107025
Diffstat (limited to 'src')
| -rw-r--r-- | src/kitemviews/private/kfileitemmodelsortalgorithm.cpp | 33 | ||||
| -rw-r--r-- | src/kitemviews/private/kfileitemmodelsortalgorithm.h | 9 |
2 files changed, 42 insertions, 0 deletions
diff --git a/src/kitemviews/private/kfileitemmodelsortalgorithm.cpp b/src/kitemviews/private/kfileitemmodelsortalgorithm.cpp index e0aac13de..63eaea557 100644 --- a/src/kitemviews/private/kfileitemmodelsortalgorithm.cpp +++ b/src/kitemviews/private/kfileitemmodelsortalgorithm.cpp @@ -19,10 +19,21 @@ #include "kfileitemmodelsortalgorithm.h" +#include <QThread> +#include <QtCore> + void KFileItemModelSortAlgorithm::sort(KFileItemModel* model, QList<KFileItemModel::ItemData*>::iterator begin, QList<KFileItemModel::ItemData*>::iterator end) { + static const int numberOfThreads = QThread::idealThreadCount(); + parallelSort(model, begin, end, numberOfThreads); +} + +void KFileItemModelSortAlgorithm::sequentialSort(KFileItemModel* model, + QList< KFileItemModel::ItemData* >::iterator begin, + QList< KFileItemModel::ItemData* >::iterator end) +{ // The implementation is based on qStableSortHelper() from qalgorithms.h // Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). @@ -37,6 +48,28 @@ void KFileItemModelSortAlgorithm::sort(KFileItemModel* model, merge(model, begin, middle, end); } +void KFileItemModelSortAlgorithm::parallelSort(KFileItemModel* model, + QList< KFileItemModel::ItemData* >::iterator begin, + QList< KFileItemModel::ItemData* >::iterator end, + const int numberOfThreads) +{ + const int span = end - begin; + + if (numberOfThreads > 1 && span > 100) { + const int newNumberOfThreads = numberOfThreads / 2; + const QList<KFileItemModel::ItemData*>::iterator middle = begin + span / 2; + + QFuture<void> future = QtConcurrent::run(parallelSort, model, begin, middle, newNumberOfThreads); + parallelSort(model, middle, end, newNumberOfThreads); + + future.waitForFinished(); + + merge(model, begin, middle, end); + } else { + sequentialSort(model, begin, end); + } +} + void KFileItemModelSortAlgorithm::merge(KFileItemModel* model, QList<KFileItemModel::ItemData*>::iterator begin, QList<KFileItemModel::ItemData*>::iterator pivot, diff --git a/src/kitemviews/private/kfileitemmodelsortalgorithm.h b/src/kitemviews/private/kfileitemmodelsortalgorithm.h index 3a596dff5..07e5d4a81 100644 --- a/src/kitemviews/private/kfileitemmodelsortalgorithm.h +++ b/src/kitemviews/private/kfileitemmodelsortalgorithm.h @@ -44,6 +44,15 @@ public: QList<KFileItemModel::ItemData*>::iterator end); private: + static void sequentialSort(KFileItemModel* model, + QList<KFileItemModel::ItemData*>::iterator begin, + QList<KFileItemModel::ItemData*>::iterator end); + + static void parallelSort(KFileItemModel* model, + QList<KFileItemModel::ItemData*>::iterator begin, + QList<KFileItemModel::ItemData*>::iterator end, + const int numberOfThreads); + static void merge(KFileItemModel* model, QList<KFileItemModel::ItemData*>::iterator begin, QList<KFileItemModel::ItemData*>::iterator pivot, |
