如果我用多线程再次读取相同的图像,cv :: imread运行得更快

时间:2016-07-12 18:47:33

标签: c++ multithreading opencv

最近我想在我的文件夹中处理很多图像,为了加快速度,我决定尝试多线程。我写了这样的东西

#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,它也有同样的问题。有谁知道这背后的原因?我怎么能像第二次一样快地加载图像?谢谢

0 个答案:

没有答案