Returning std::optional<Result>: Wrapper Local vs Value Local
Question 9 / 12 • Correct so far: 0 (0 answered)
Optional Wrapper Local
NOINLINE std::optional<Result> compute(std::uint64_t input) {
std::optional<Result> result(std::in_place);
result->label = "result";
for (std::size_t i = 0; i < kDataSize; ++i)
result->data[i] = static_cast<double>(input ^ i);
return result;
}
for (std::uint64_t input : inputs) {
std::optional<Result> r = compute(input);
checksum += r->data[input % kDataSize];
} Optional Value Local
NOINLINE std::optional<Result> compute(std::uint64_t input) {
Result result{};
result.label = "result";
for (std::size_t i = 0; i < kDataSize; ++i)
result.data[i] = static_cast<double>(input ^ i);
return result;
}
for (std::uint64_t input : inputs) {
std::optional<Result> r = compute(input);
checksum += r->data[input % kDataSize];
} Shared test data (shared-setup)
struct Result {
std::string label;
std::array<double, 1024> data;
};
constexpr std::size_t kDataSize = 1024;
constexpr std::size_t kInputCount = 512;
static std::vector<std::uint64_t> inputs;
struct DataInit {
DataInit() {
inputs.reserve(kInputCount);
for (std::size_t i = 0; i < kInputCount; ++i) {
inputs.push_back(static_cast<std::uint64_t>(i));
}
}
} data_init; Which snippet is faster?
Snippet A is faster because it returns a named std::optional
Benchmark results
| Snippet | CPU time / iteration | Speedup |
|---|---|---|
| Optional Value Local | 99.7 us | 1.0× |
| Optional Wrapper Local | 65 us | 1.5× |
Explore the source
Open in Compiler ExplorerQuiz complete. You can return to the question list to restart and compare.