]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Implemented multithreading in KFileItemModelSortAlgorithm. Use as many threads as...
authorEmmanuel Pescosta <emmanuelpescosta099@gmail.com>
Sun, 28 Oct 2012 16:58:06 +0000 (17:58 +0100)
committerEmmanuel Pescosta <emmanuelpescosta099@gmail.com>
Sun, 28 Oct 2012 16:58:06 +0000 (17:58 +0100)
Thanks to Frank Reininghaus for all his suggestions.

REVIEW: 107025

src/kitemviews/private/kfileitemmodelsortalgorithm.cpp
src/kitemviews/private/kfileitemmodelsortalgorithm.h

index e0aac13de3e1f7848280ae26d8b5e9a92c081ff2..63eaea55784a3b45e91106245f5bdd636e2bfadd 100644 (file)
 
 #include "kfileitemmodelsortalgorithm.h"
 
 
 #include "kfileitemmodelsortalgorithm.h"
 
+#include <QThread>
+#include <QtCore>
+
 void KFileItemModelSortAlgorithm::sort(KFileItemModel* model,
                                        QList<KFileItemModel::ItemData*>::iterator begin,
                                        QList<KFileItemModel::ItemData*>::iterator end)
 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).
 {
     // 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);
 }
 
     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,
 void KFileItemModelSortAlgorithm::merge(KFileItemModel* model,
                                         QList<KFileItemModel::ItemData*>::iterator begin,
                                         QList<KFileItemModel::ItemData*>::iterator pivot,
index 3a596dff56ddd83f8bfde1f3af455e53a2d920a0..07e5d4a814d02031cb1667fecaf48e42bddea1df 100644 (file)
@@ -44,6 +44,15 @@ public:
                      QList<KFileItemModel::ItemData*>::iterator end);
 
 private:
                      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,
     static void merge(KFileItemModel* model,
                       QList<KFileItemModel::ItemData*>::iterator begin,
                       QList<KFileItemModel::ItemData*>::iterator pivot,