summaryrefslogtreecommitdiffstats
path: root/vespalib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2022-11-08 17:08:33 +0100
committerGitHub <noreply@github.com>2022-11-08 17:08:33 +0100
commitc2193f43a0e289bfda4cab875c2058d9d0e21afd (patch)
treedd095af815a3cbf79f2d426195855767b3f37a6e /vespalib
parentf268379cb63e70cefaea18999767244a7d8bfc7f (diff)
parent208f51ab3e34dbca1458f9557fa657abda2d6cb3 (diff)
Merge pull request #24778 from vespa-engine/havardpe/generator-micro-bench
added simple micro-bench to show generator overhead
Diffstat (limited to 'vespalib')
-rw-r--r--vespalib/src/tests/coro/generator/.gitignore1
-rw-r--r--vespalib/src/tests/coro/generator/CMakeLists.txt7
-rw-r--r--vespalib/src/tests/coro/generator/generator_bench.cpp58
3 files changed, 66 insertions, 0 deletions
diff --git a/vespalib/src/tests/coro/generator/.gitignore b/vespalib/src/tests/coro/generator/.gitignore
new file mode 100644
index 00000000000..748003a81fe
--- /dev/null
+++ b/vespalib/src/tests/coro/generator/.gitignore
@@ -0,0 +1 @@
+/vespalib_generator_bench_app
diff --git a/vespalib/src/tests/coro/generator/CMakeLists.txt b/vespalib/src/tests/coro/generator/CMakeLists.txt
index b4f59c69451..e2534274f7c 100644
--- a/vespalib/src/tests/coro/generator/CMakeLists.txt
+++ b/vespalib/src/tests/coro/generator/CMakeLists.txt
@@ -6,4 +6,11 @@ vespa_add_executable(vespalib_generator_test_app TEST
vespalib
GTest::GTest
)
+vespa_add_executable(vespalib_generator_bench_app TEST
+ SOURCES
+ generator_bench.cpp
+ DEPENDS
+ vespalib
+ GTest::GTest
+)
vespa_add_test(NAME vespalib_generator_test_app COMMAND vespalib_generator_test_app)
diff --git a/vespalib/src/tests/coro/generator/generator_bench.cpp b/vespalib/src/tests/coro/generator/generator_bench.cpp
new file mode 100644
index 00000000000..664132b7ba4
--- /dev/null
+++ b/vespalib/src/tests/coro/generator/generator_bench.cpp
@@ -0,0 +1,58 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/vespalib/coro/generator.h>
+#include <vespa/vespalib/util/benchmark_timer.h>
+#include <vespa/vespalib/gtest/gtest.h>
+#include <ranges>
+#include <vector>
+
+using vespalib::coro::Generator;
+using vespalib::BenchmarkTimer;
+
+std::vector<size_t> make_data() __attribute__((noinline));
+std::vector<size_t> make_data(size_t size) {
+ std::vector<size_t> data;
+ for (size_t i = 0; i < size; ++i) {
+ data.push_back(i);
+ }
+ return data;
+}
+
+template <std::ranges::input_range T>
+size_t calc_sum(T&& values) {
+ size_t sum = 0;
+ for (auto&& value: values) {
+ sum += value;
+ }
+ return sum;
+}
+
+size_t calc_sum_direct(const std::vector<size_t> &values) {
+ return calc_sum(values);
+}
+
+size_t calc_sum_wrapped(const std::vector<size_t> &values) {
+ return calc_sum([](const std::vector<size_t> &inner_values)->Generator<size_t>
+ {
+ for (auto&& value: inner_values) {
+ co_yield value;
+ }
+ }(values));
+}
+
+TEST(GeneratorBench, direct_vs_wrapped_vector_for_loop) {
+ std::vector<size_t> data = make_data(100000);
+ double direct_ms = BenchmarkTimer::benchmark([&data](){
+ size_t sink = calc_sum_direct(data);
+ (void) sink;
+ }, 5.0) * 1000.0;
+ fprintf(stderr, "direct: %g ms\n", direct_ms);
+ double wrapped_ms = BenchmarkTimer::benchmark([&data](){
+ size_t sink = calc_sum_wrapped(data);
+ (void) sink;
+ }, 5.0) * 1000.0;
+ fprintf(stderr, "wrapped: %g ms\n", wrapped_ms);
+ fprintf(stderr, "ratio: %g\n", (wrapped_ms/direct_ms));
+}
+
+GTEST_MAIN_RUN_ALL_TESTS()