c++ - boost::asio::post: 在 lambda 与内联定义中调用函数
问题描述
我正在试验boost::asio::thread_pool
andboost::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 的原因是希望保存函数调用。但它并没有达到我的预期。
这两个版本有什么区别?为什么运行时的差异?
解决方案
推荐阅读
- python - 如何使用 cm_api api.query_timeseries 设置数据粒度
- php - 如何将大多数产品添加到 laravel 的收藏夹列表中?
- javascript - 向 span 标签添加了 click 事件,并从命名空间中调用了两次
- r - 如何使用 purrr 在多个条件下替换值?
- php - 如何使用 php 中的变量设置具有不同颜色的滑块标题的两个第一个单词?
- r - R:不能用向量中的零替换 NA
- vb.net - 分组不使用两列,但使用一列
- if-statement - 三元运算符的效率是否低于为变量设置不同值的 if 语句
- ruby-on-rails - 为什么我得到 SON::ParserError 试图使用 json_matchers 验证响应?
- c# - C#将多个控制台行写入文本文件