aboutsummaryrefslogtreecommitdiffstats
path: root/vespalib/src/tests/coro
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@yahooinc.com>2022-11-23 15:21:13 +0000
committerHåvard Pettersen <havardpe@yahooinc.com>2022-11-28 09:08:19 +0000
commit8bfe2a90bf8460bfc209a555d8a3974c589232ce (patch)
tree602278a86409a95c4084f29c3eb0587c8ef7bf0e /vespalib/src/tests/coro
parent0829f491b6f1f1222ec499337de354f5bf4dd010 (diff)
align internal generator types with std::generator proposal
Diffstat (limited to 'vespalib/src/tests/coro')
-rw-r--r--vespalib/src/tests/coro/generator/CMakeLists.txt1
-rw-r--r--vespalib/src/tests/coro/generator/generator_bench.cpp50
-rw-r--r--vespalib/src/tests/coro/generator/hidden_sequence.cpp21
-rw-r--r--vespalib/src/tests/coro/generator/hidden_sequence.h8
4 files changed, 56 insertions, 24 deletions
diff --git a/vespalib/src/tests/coro/generator/CMakeLists.txt b/vespalib/src/tests/coro/generator/CMakeLists.txt
index e2534274f7c..d2c8ec9b857 100644
--- a/vespalib/src/tests/coro/generator/CMakeLists.txt
+++ b/vespalib/src/tests/coro/generator/CMakeLists.txt
@@ -9,6 +9,7 @@ vespa_add_executable(vespalib_generator_test_app TEST
vespa_add_executable(vespalib_generator_bench_app TEST
SOURCES
generator_bench.cpp
+ hidden_sequence.cpp
DEPENDS
vespalib
GTest::GTest
diff --git a/vespalib/src/tests/coro/generator/generator_bench.cpp b/vespalib/src/tests/coro/generator/generator_bench.cpp
index ae0e0fce894..4fa9c6186f5 100644
--- a/vespalib/src/tests/coro/generator/generator_bench.cpp
+++ b/vespalib/src/tests/coro/generator/generator_bench.cpp
@@ -1,5 +1,6 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include "hidden_sequence.h"
#include <vespa/vespalib/coro/generator.h>
#include <vespa/vespalib/util/benchmark_timer.h>
#include <vespa/vespalib/util/sequence.h>
@@ -11,23 +12,8 @@ using vespalib::coro::Generator;
using vespalib::BenchmarkTimer;
using vespalib::Sequence;
-size_t calc_sum(const std::vector<size_t> &values) {
- size_t sum = 0;
- for (auto&& value: values) {
- sum += value;
- }
- return sum;
-}
-
-size_t calc_sum(Generator<size_t> values) {
- size_t sum = 0;
- for (auto&& value: values) {
- sum += value;
- }
- return sum;
-}
-
-size_t calc_sum(Generator<const size_t &> values) {
+template <std::ranges::input_range T>
+size_t calc_sum(T &&values) {
size_t sum = 0;
for (auto&& value: values) {
sum += value;
@@ -42,6 +28,7 @@ size_t calc_sum(Sequence<size_t> &seq) {
}
return sum;
}
+size_t calc_sum(Sequence<size_t>::UP &ptr) { return calc_sum(*ptr); }
std::vector<size_t> make_data() __attribute__((noinline));
std::vector<size_t> make_data() {
@@ -83,9 +70,9 @@ size_t calc_sum_generator(const std::vector<size_t> &data) {
return calc_sum(gen_values(data));
}
-Generator<const size_t &> gen_values_noinline(const std::vector<size_t> &data) __attribute__((noinline));
-Generator<const size_t &> gen_values_noinline(const std::vector<size_t> &data) {
- for (const size_t &value: data) {
+Generator<size_t> gen_values_noinline(const std::vector<size_t> &data) __attribute__((noinline));
+Generator<size_t> gen_values_noinline(const std::vector<size_t> &data) {
+ for (size_t value: data) {
co_yield value;
}
}
@@ -104,22 +91,37 @@ double bench(auto fun, const std::vector<size_t> &data, size_t &res) {
return timer.min_time() * 1000.0;
}
+double bench_indirect(auto factory, const std::vector<size_t> &data, size_t &res) {
+ BenchmarkTimer timer(5.0);
+ while (timer.has_budget()) {
+ auto seq = factory(data);
+ timer.before();
+ res = calc_sum(seq);
+ timer.after();
+ }
+ return timer.min_time() * 1000.0;
+}
+
TEST(GeneratorBench, direct_vs_generated_for_loop) {
auto data = make_data();
- size_t result[4] = { 0, 1, 2, 3 };
+ size_t result[5] = { 0, 1, 2, 3, 4 };
double sequence_ms = bench(calc_sum_sequence, data, result[0]);
fprintf(stderr, "sequence: %g ms\n", sequence_ms);
- double generator_noinline_ms = bench(calc_sum_generator_noinline, data, result[1]);
+ double hidden_sequence_ms = bench_indirect(make_ext_seq, data, result[1]);
+ fprintf(stderr, "hidden sequence: %g ms\n", hidden_sequence_ms);
+ double generator_noinline_ms = bench(calc_sum_generator_noinline, data, result[2]);
fprintf(stderr, "generator_noinline: %g ms\n", generator_noinline_ms);
- double generator_ms = bench(calc_sum_generator, data, result[2]);
+ double generator_ms = bench(calc_sum_generator, data, result[3]);
fprintf(stderr, "generator: %g ms\n", generator_ms);
- double direct_ms = bench(calc_sum_direct, data, result[3]);
+ double direct_ms = bench(calc_sum_direct, data, result[4]);
fprintf(stderr, "direct: %g ms\n", direct_ms);
EXPECT_EQ(result[0], result[1]);
EXPECT_EQ(result[0], result[2]);
EXPECT_EQ(result[0], result[3]);
+ EXPECT_EQ(result[0], result[4]);
fprintf(stderr, "ratio (generator/direct): %g\n", (generator_ms/direct_ms));
fprintf(stderr, "ratio (generator_noinline/generator): %g\n", (generator_noinline_ms/generator_ms));
+ fprintf(stderr, "ratio (sequence/generator_noinline): %g\n", (sequence_ms/generator_noinline_ms));
fprintf(stderr, "ratio (sequence/generator): %g\n", (sequence_ms/generator_ms));
}
diff --git a/vespalib/src/tests/coro/generator/hidden_sequence.cpp b/vespalib/src/tests/coro/generator/hidden_sequence.cpp
new file mode 100644
index 00000000000..39eedb4623c
--- /dev/null
+++ b/vespalib/src/tests/coro/generator/hidden_sequence.cpp
@@ -0,0 +1,21 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "hidden_sequence.h"
+
+namespace {
+
+struct MyHiddenSeq : vespalib::Sequence<size_t> {
+ const std::vector<size_t> &data;
+ size_t pos;
+ MyHiddenSeq(const std::vector<size_t> &data_in)
+ : data(data_in), pos(0) {}
+ bool valid() const override { return pos < data.size(); }
+ size_t get() const override { return data[pos]; }
+ void next() override { ++pos; }
+};
+
+}
+
+vespalib::Sequence<size_t>::UP make_ext_seq(const std::vector<size_t> &data) {
+ return std::make_unique<MyHiddenSeq>(data);
+}
diff --git a/vespalib/src/tests/coro/generator/hidden_sequence.h b/vespalib/src/tests/coro/generator/hidden_sequence.h
new file mode 100644
index 00000000000..917b50b1129
--- /dev/null
+++ b/vespalib/src/tests/coro/generator/hidden_sequence.h
@@ -0,0 +1,8 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include <vespa/vespalib/util/sequence.h>
+#include <vector>
+
+vespalib::Sequence<size_t>::UP make_ext_seq(const std::vector<size_t> &data);