Почему c ++ foreach медленнее, чем простой однопоточный l oop? - PullRequest
0 голосов
/ 19 марта 2020

Мой код выглядит следующим образом:

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;

Интуитивно я чувствую, что foreach должен работать быстрее, поскольку он использует многопоточный механизм для выполнения работы, но в результате получается, что foreach методы заняли 14759 мс, а наивный метод l oop - всего 6791 мс. В чем причина более медленного foreach метода и как его можно сделать быстрее?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...