我想使用QtConcurrent::map
函数来操作QVector
。我所有的示例程序不会是1QtConcurrent :: map没有任何好处
QVector<double> arr(10000000, 0);
QElapsedTimer timer;
qDebug() << QThreadPool::globalInstance()->maxThreadCount() << "Threads";
int end;
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
timer.start();
for(int i = 0; i < 100; ++i) {
std::transform(arr.begin(), arr.end(), arr.begin(), [](double x){ return ++x; });
}
end = timer.elapsed();
qDebug() << end;
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
timer.start();
for(int i = 0; i < 100; ++i) {
std::for_each(arr.begin(), arr.end(), [](double &x){ ++x; });
}
end = timer.elapsed();
qDebug() << end;
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
timer.start();
for(int i = 0; i < 100; ++i) {
QFuture<void> qf = QtConcurrent::map(arr.begin(), arr.end(), [](double &x){ ++x; });
qf.waitForFinished();
}
end = timer.elapsed();
qDebug() << end;
然而递增的QVector
所有值方案产出
4 Threads
905 // std::transform
886 // std::for_each
876 // QtConcurrent::map
所以几乎与多线程版本没有速度优势。我确认实际上有4个线程正在运行。我使用了-O2优化。更常见的QThreadPool
方法更适合这种情况吗?
编辑:
我尝试使用QtConcurrent::run()
一个differernt方法。下面是程序代码的相关部分:
void add1(QVector<double>::iterator first, QVector<double>::iterator last) {
for(; first != last; ++first) {
*first += 1;
}
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
std::for_each(arr.begin(), arr.end(), [](double &x){ ++x; });
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
QFuture<void> qf[numThreads];
for(int j = 0; j < numThreads; ++j) {
qf[j] = QtConcurrent::run(add1, arr.begin()+j*n/numThreads, arr.begin()+(j+1)*n/numThreads-1);
}
for(int j = 0; j < numThreads; ++j) {
qf[j].waitForFinished();
}
所以我手动在不同的线程分配任务。但我仍然很难获得性能提升:
181 ms // std::for_each
163 ms // QtConcurrent::run
这里还有什么不对?
你为什么期望加快速度?您在每次循环迭代中都在等待未来。 – juanchopanza
我不是这方面的专家,但我期望map()启动4个线程,这应该使这个代码行比STL函数更快地完成。还是我误解了这个功能的概念? – NullAchtFuffZehn