C++ 线程池性能
为什么我使用4线程的快速排序比使用1线程的快? 使用MPI会给算法带来哪些好处? n=10000000; 正常时间:1.22秒 时间线程计数4:1.66s main.cpp 标题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=
#包括“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);
}