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;
しかしプログラムの出力
4 Threads
905 // std::transform
886 // std::for_each
876 // QtConcurrent::map
によってQVector
内のすべての値をインクリメントすることです。実際には4つのスレッドが実行されていることを確認しました。私は-O2最適化を使用しました。このような状況に、より一般的なQThreadPool
アプローチが適していますか?
EDIT:
Iは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