我想使用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