Я хочу манипулировать QVector
с помощью функции QtConcurrent::map
. Все, что делает мой пример программы, это увеличивает все значения в QVector
на 1.
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
так что в многопоточной версии почти нет выигрыша в скорости. Я проверил, что на самом деле работает 4 потока. Я использовал оптимизацию -O2. Подходит ли для этой ситуации более распространенный подход QThreadPool
?
ИЗМЕНИТЬ:
Я попробовал другой метод, используя QtConcurrent::run()
. Вот соответствующие части программного кода:
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
Что еще здесь не так?