首页 > 解决方案 > boost::asio::post: 在 lambda 与内联定义中调用函数

问题描述

我正在试验boost::asio::thread_poolandboost::asio::post()功能。
在执行矩阵乘法的程序中,我使用了函数的第三个重载

decltype (auto) matrix_multiplication (const matrix& A, const matrix& B)
{
  
  // ...

  const auto CPU_CORES{std::thread::hardware_concurrency ()};
  boost::asio::thread_pool pool{CPU_CORES};

  for (auto row_a{0u}; row_a < A_ROWS; ++row_a)
    {
      for (auto col_b{0u}; col_b < B_COLS; ++col_b)
        {
          // VERSION 1
          boost::asio::post (pool, [&A, &B, &result, row_a, col_b] ()
          {
            calculate_result_cell (A, B, row_a, col_b,
                                   result[row_a][col_b]);
          });

          // VERSION 2
          boost::asio::post (pool, [&A, &B, &result, row_a, col_b] ()
          {
            result[row_a][col_b] = 0;
            for (auto inner{0u}; inner < B.size (); ++inner)
              {
                result[row_a][col_b] += A[row_a][inner] * B[inner][col_b];
              }
          });
        }
    }

  // ...
}

在哪里calculate_result_cell与版本 2 中的相同:

decltype (auto) calculate_result_cell (const matrix& A, const matrix& B,
                                       int row, int col, int& res)
{
  res = 0;

  for (auto inner{0u}; inner < B.size (); ++inner)
    {
      res += A[row][inner] * B[inner][col];
    }
}

当我作为小型基准测试的一部分测试这两个版本时(使用 1'000 x 1'000 矩阵调用每个版本五次),VERSION 2 花费的时间明显更长(~20%)。我首先尝试 VERSION 2 的原因是希望保存函数调用。但它并没有达到我的预期。

这两个版本有什么区别?为什么运行时的差异?

标签: c++postboost-asio

解决方案


推荐阅读