diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2022-11-08 17:08:33 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-11-08 17:08:33 +0100 |
commit | c2193f43a0e289bfda4cab875c2058d9d0e21afd (patch) | |
tree | dd095af815a3cbf79f2d426195855767b3f37a6e | |
parent | f268379cb63e70cefaea18999767244a7d8bfc7f (diff) | |
parent | 208f51ab3e34dbca1458f9557fa657abda2d6cb3 (diff) |
Merge pull request #24778 from vespa-engine/havardpe/generator-micro-bench
added simple micro-bench to show generator overhead
-rw-r--r-- | vespalib/src/tests/coro/generator/.gitignore | 1 | ||||
-rw-r--r-- | vespalib/src/tests/coro/generator/CMakeLists.txt | 7 | ||||
-rw-r--r-- | vespalib/src/tests/coro/generator/generator_bench.cpp | 58 |
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() |