gpt4 book ai didi

c++ - 嵌套的std::transform效率低下吗?

转载 作者:行者123 更新时间:2023-12-02 09:54:37 25 4
gpt4 key购买 nike

如果我有一个std::string:

std::string s{"hello"};

和一个就地修改它的循环,如下所示:
for (auto &c: s)
c = std::toupper(c);

我可以用等效的 transform代替它:
std::transform(s.begin(), s.end(), s.begin(),
[](unsigned char c) -> unsigned char
{ return std::toupper(c); });

这些片段生成相同的 assembly。他们也有类似的 performance

但是,如果我有一个 std::vector<std::string>:
std::vector<std::string> v {"hello", "how", "are", "you"};

并像这样修改它:
for (auto & s : v)
for (auto &c: s)
c = std::toupper(c);

等效变换应为:
std::transform(std::begin(v), std::end(v), std::begin(v),
[](auto s) {
std::transform(std::begin(s), std::end(s), std::begin(s),
[](unsigned char c) -> unsigned char { return std::toupper(c); });
return s;
});

但是, transform版本生成的 assemblyperforms相应地差一半以上,这令我感到惊讶。

在这种情况下, std::transform是否不是零成本的抽象,还是我使用不正确?

最佳答案

传递并通过引用返回所有内容。否则,您将创建字符串的多个副本。注意更改:[](auto& s) -> std::string& {

std::transform(std::begin(v), std::end(v), std::begin(v),
[](auto& s) -> std::string& {
std::transform(std::begin(s), std::end(s), std::begin(s),
[](unsigned char c) -> unsigned char { return std::toupper(c); });
return s;
});

我在链接中添加了两个新的quickbench函数。一种将输入字符串作为引用传递的方法。另一个也通过引用返回。那是:
static void Transform2(benchmark::State& state) {
// Code before the loop is not measured

std::vector<std::string> v {"hello", "how", "are", "you"};
for (auto _ : state) {
std::transform(std::begin(v), std::end(v), std::begin(v),
[](auto& s) {
std::transform(std::begin(s), std::end(s), std::begin(s),
[](unsigned char c) -> unsigned char { return std::toupper(c); });
return s;
});

}
}
BENCHMARK(Transform2);


static void Transform3(benchmark::State& state) {
// Code before the loop is not measured

std::vector<std::string> v {"hello", "how", "are", "you"};
for (auto _ : state) {
std::transform(std::begin(v), std::end(v), std::begin(v),
[](auto& s) -> std::string& {
std::transform(std::begin(s), std::end(s), std::begin(s),
[](unsigned char c) -> unsigned char { return std::toupper(c); });
return s;
});

}
}
BENCHMARK(Transform3);

根据运行基准测试时我有多幸运,Transform3在InPlace测试实现方面的表现几乎(有时是相等)。

enter image description here

关于c++ - 嵌套的std::transform效率低下吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61263702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com