通过引用传递和返回所有内容。否则,您将复制该字符串的多个副本。注意变化:[](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;
});
我在您的链接中添加了两个新的快速工作台功能。一种将输入字符串作为引用传递的字符串。另一个也通过引用返回。那是:
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 测试实现。