From 208f51ab3e34dbca1458f9557fa657abda2d6cb3 Mon Sep 17 00:00:00 2001 From: HÃ¥vard Pettersen Date: Mon, 7 Nov 2022 12:00:57 +0000 Subject: added simple micro-bench to show generator overhead --- vespalib/src/tests/coro/generator/.gitignore | 1 + vespalib/src/tests/coro/generator/CMakeLists.txt | 7 +++ .../src/tests/coro/generator/generator_bench.cpp | 58 ++++++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 vespalib/src/tests/coro/generator/.gitignore create mode 100644 vespalib/src/tests/coro/generator/generator_bench.cpp 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 +#include +#include +#include +#include + +using vespalib::coro::Generator; +using vespalib::BenchmarkTimer; + +std::vector make_data() __attribute__((noinline)); +std::vector make_data(size_t size) { + std::vector data; + for (size_t i = 0; i < size; ++i) { + data.push_back(i); + } + return data; +} + +template +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 &values) { + return calc_sum(values); +} + +size_t calc_sum_wrapped(const std::vector &values) { + return calc_sum([](const std::vector &inner_values)->Generator + { + for (auto&& value: inner_values) { + co_yield value; + } + }(values)); +} + +TEST(GeneratorBench, direct_vs_wrapped_vector_for_loop) { + std::vector 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() -- cgit v1.2.3