c++ - std::transform 比 for 循环慢
问题描述
我考虑过实现一个std::transform
从算法中用于计算的矩阵类,但我发现在某些情况下编写循环更快。
看看添加operator+=
元素明智的添加。如果 rhs 矩阵有 1 col 而行数与 lhs 矩阵相同,我可以执行以下操作:
for (auto c = 0; c < cols(); ++c) {
std::transform(std::execution::par, col_begin(c), col_end(c), rhs.begin(), col_begin(c), std::plus<>());
}
或使用简单的循环:
auto lhsval = begin();
auto rhsval= rhs.begin();
for (auto r = 0; r < rows(); ++r) {
for (auto c = 0; c < cols(); ++c) {
*lhsval += *rhsval;
++lhsval;
}
++rhsval;
}
为了您的信息,我写了一个接受一个步骤的迭代器。所以col_begin()
返回一个迭代器,它将跳过中的其他列operator++
我使用谷歌基准测试了两种实现之间的差异,并得出结论,循环比使用 std::transform 快大约 5 倍。好吧,也许应该有区别,但没有那么大的区别。
解决方案
传递std::execution::par
是要求库并行化此操作。这会增加开销,即使只是为了确定“您的问题太小而无法并行化”。在并行化值得之前,被转换的元素数量必须非常大(有时数十万或数百万),并且需要您拥有适当的硬件(在两核机器上并行化比在64 核机器)。
for
循环版本更类似于std::transform
没有std::execution::par
参数的普通版本。如果您删除该参数并且性能差异仍然很大,请使用该信息更新您的问题,以及您的编译器版本、平台、编译器开关和有关您的数据集的信息:行数/列数等。
推荐阅读
- javascript - ReactJS,是否可以在不使用 document.getElementbyId 的情况下引用另一个组件中的对象?
- wordpress - 如何在联系表单中显示页面标题?
- r - 如何一次访问 R 中的所有子列表元素?
- cakephp-3.0 - Cake PHP 3.5 路线
- java - 如何使用 AWQL 或选择器阅读所有 google adwords 定位选项?
- apache-spark - 如何在集群上运行 spark 作业时传递外部资源 yml /property 文件?
- javascript - js正则表达式中的新行
- google-bigquery - Google Dataflow:如何将 RECORD 非重复类型字段插入 Big Query?
- python - 如何添加关于最大项目的新列?
- python - 如何获取具有嵌入式键值对数组的 PyMongo 文档的值(实时)