C++ 为什么c++;foreach比朴素的单线程循环慢?

C++ 为什么c++;foreach比朴素的单线程循环慢?,c++,opencv,C++,Opencv,我的代码如下: auto t1 = std::chrono::steady_clock::now(); for (int t{0}; t < 100; ++t) { vector<int> table(256, 0); Mat im2 = cv::imread(impth, cv::ImreadModes::IMREAD_COLOR); im2.forEach<cv::Vec3b>([&table](c

我的代码如下:

auto t1 = std::chrono::steady_clock::now();
    for (int t{0}; t < 100; ++t) {
        vector<int> table(256, 0);
        Mat im2 = cv::imread(impth, cv::ImreadModes::IMREAD_COLOR);
        im2.forEach<cv::Vec3b>([&table](cv::Vec3b &pix, const int* pos) {
                for (int i{0}; i < 3; ++i) ++table[pix[i]];
        });
    }
    auto t2 = std::chrono::steady_clock::now();
    cout << "time is: " << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << endl;

    auto t3 = std::chrono::steady_clock::now();
    for (int t{0}; t < 100; ++t) {
        vector<int> table(256, 0);
        Mat im2 = cv::imread(impth, cv::ImreadModes::IMREAD_COLOR);
        for (int r{0}; r < im2.rows; ++r) {
            auto ptr = im2.ptr<uint8_t>(r);
            for (int c{0}; c < im2.cols; ++c) {
                for (int i{0}; i < 3; ++i) ++table[ptr[i]];
                ptr += 3;
            }
        }
    }
    auto t4 = std::chrono::steady_clock::now();
    cout << "time is: " << std::chrono::duration_cast<std::chrono::milliseconds>(t4 - t3).count() << endl;
auto t1=std::chrono::staid_clock::now();
for(int t{0};t<100;++t){
向量表(256,0);
Mat im2=cv::imread(impth,cv::ImreadModes::imread\u COLOR);
im2.forEach([&表](cv::Vec3b&pix,const int*pos){
对于(inti{0};i<3;++i)+表[pix[i]];
});
}
自动t2=std::chrono::稳定时钟::现在();

当我尝试它时,foreach的速度快了近30毫秒,它真的能工作吗?看起来您是在不同步的情况下并发写入
(并且您会通过并发写入将该向量反弹到整个内核上)。
foreach
线程的使用取决于opencv库的构建方式。如果它是在不支持多线程的情况下构建的,那么就不会看到多线程的好处。更多信息,请看一看。@Peter我不是用TBB构建的,但根据我的观察,当我使用
foreach
实现类似的功能,如
LUT
,我可以从
htop
的输出中观察到使用了多个cpu核,这是否意味着启用了多线程?您是否使用了优化的代码?