最近我想在我的文件夹中处理很多图像,为了加快速度,我决定尝试多线程。我写了这样的东西
#include <QDebug>
#include <QDirIterator>
#include <QtConcurrent/QtConcurrentMap>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <atomic>
#include <chrono>
int main()
{
QDirIterator directories("some_img",
QDir::Files | QDir::NoSymLinks | QDir::NoDotAndDotDot,
QDirIterator::Subdirectories);
QStringList path;
while(directories.hasNext()){
path.push_back(directories.filePath());
directories.next();
}
qDebug()<<"file size : "<<path.size();
std::atomic<size_t> size = 0;
auto compute_hash = [&](QString const &name)
{
auto const img = cv::imread(name.toStdString());
if(!img.empty()){
++size;
//in real case, I would do something at here
}
};
std::chrono::time_point<std::chrono::system_clock> start, end;
start = std::chrono::system_clock::now();
QtConcurrent::blockingMap(path, compute_hash);
end = std::chrono::system_clock::now();
qDebug()<<"elapsed : "<<
std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
}
第一次,从磁盘读取所有图像需要84046364us,第一次使用率低于15%。
第二次(关闭并重新启动程序),我只花了5493552us从磁盘读取所有图像,这次CPU使用率提高了90%以上。性能比第一次好15倍左右。
我试试intelTBB,它也有同样的问题。有谁知道这背后的原因?我怎么能像第二次一样快地加载图像?谢谢