C++ 线程池性能

C++ 线程池性能,c++,multithreading,qt,threadpool,C++,Multithreading,Qt,Threadpool,为什么我使用4线程的快速排序比使用1线程的快? 使用MPI会给算法带来哪些好处? n=10000000; 正常时间:1.22秒 时间线程计数4:1.66s main.cpp 标题 #包括“quicksorttask.h” #包括 #包括 QuickSortTask::QuickSortTask(int arr[],int left,int right): 马尔{arr}, mLeft{左}, mRight{right} { } void QuickSortTask::run() { int i=

为什么我使用4线程的快速排序比使用1线程的快? 使用MPI会给算法带来哪些好处? n=10000000; 正常时间:1.22秒 时间线程计数4:1.66s

main.cpp 标题

#包括“quicksorttask.h”
#包括
#包括
QuickSortTask::QuickSortTask(int arr[],int left,int right):
马尔{arr},
mLeft{左},
mRight{right}
{
}
void QuickSortTask::run()
{
int i=mLeft,j=mRight;
int pivot=mArr[(mLeft+mRight)/2];
int tmp;
/*分割*/
而(我)
{
j--;
}
如果(i)100000
{
QuickSortTask*task=新的QuickSortTask(mArr、mLeft、j);
QThreadPool::globalInstance()->启动(任务);
}
其他的
{
快速排序(马尔、姆莱夫特、j);
}
}
如果(i100000)
{
QuickSortTask*task=新的QuickSortTask(mArr、i、mRight);
QThreadPool::globalInstance()->启动(任务);
}
其他的
{
快速排序(mArr、i、mRight);
}
}
}
void QuickSortTask::quickSort(int arr[],int left,int right){
int i=左,j=右;
int tmp;
int pivot=arr[(左+右)/2];
/*分割*/
而(我)
j--;

如果(i)多线程非常昂贵。你觉得它的价格并不奇怪。那么如何获得好处呢?你认为有一种神奇的“让生活变得更好”吗你只需按下按钮就可以加快速度?你认为没有其他人愿意这样做吗?没有这种运气。你需要仔细分析你的情况,非常仔细地确定利用并行性和并发性的机会,然后相应地设计你的程序。
#include "quicksorttask.h"

#include <QThreadPool>
#include <QDebug>

QuickSortTask::QuickSortTask(int arr[], int left, int right):
    mArr{arr},
    mLeft{left},
    mRight{right}
{
}

void QuickSortTask::run()
{
    int i = mLeft, j = mRight;
    int pivot = mArr[(mLeft + mRight) / 2];

    int tmp;
    /* partition */
    while (i <= j)
    {
        while (mArr[i] < pivot)
        {
            i++;
        }
        while (mArr[j] > pivot)
        {
            j--;
        }
        if (i <= j)
        {
            tmp = mArr[i];
            mArr[i] = mArr[j];
            mArr[j] = tmp;
            i++;
            j--;
        }
    };

    /* recursion */
    if (mLeft < j)
    {
        if (abs(mLeft - j) > 100000)
        {
            QuickSortTask *task = new QuickSortTask(mArr, mLeft, j);
            QThreadPool::globalInstance()->start(task);
        }
        else
        {
            quickSort(mArr, mLeft, j);
        }
    }
    if (i < mRight)
    {
        if (abs(i - mRight) > 100000)
        {
            QuickSortTask *task = new QuickSortTask(mArr, i, mRight);
            QThreadPool::globalInstance()->start(task);
        }
        else
        {
            quickSort(mArr, i, mRight);
        }
    }
}

void QuickSortTask::quickSort(int arr[], int left, int right) {
    int i = left, j = right;
    int tmp;
    int pivot = arr[(left + right) / 2];

    /* partition */
    while (i <= j) {
        while (arr[i] < pivot)
            i++;
        while (arr[j] > pivot)
            j--;
        if (i <= j) {
            tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
            i++;
            j--;
        }
    };

    /* recursion */
    if (left < j)
        quickSort(arr, left, j);
    if (i < right)
        quickSort(arr, i, right);
}