// Copyright (c) 2023 Klemens D. Morgenstern // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include #include #include #include #if defined(BOOST_COBALT_BENCH_WITH_CONTEXT) #include #endif using namespace boost; constexpr std::size_t n = 3'000'000ull; cobalt::task atest() { cobalt::channel chan{0u}; for (std::size_t i = 0u; i < n; i++) co_await cobalt::gather(chan.write(), chan.read()); } asio::awaitable awtest() { asio::experimental::channel chan{co_await cobalt::this_coro::executor, 0u}; for (std::size_t i = 0u; i < n; i++) co_await asio::experimental::make_parallel_group( chan.async_send(system::error_code{}, asio::deferred), chan.async_receive(asio::deferred)) .async_wait(asio::experimental::wait_for_all(), asio::deferred); } #if defined(BOOST_COBALT_BENCH_WITH_CONTEXT) void stest(asio::yield_context ctx) { asio::experimental::channel chan{ctx.get_executor(), 0u}; for (std::size_t i = 0u; i < n; i++) asio::experimental::make_parallel_group( chan.async_send(system::error_code{}, asio::deferred), chan.async_receive(asio::deferred)) .async_wait(asio::experimental::wait_for_all(), ctx); } #endif int main(int argc, char * argv[]) { { auto start = std::chrono::steady_clock::now(); cobalt::run(atest()); auto end = std::chrono::steady_clock::now(); printf("cobalt : %ld ms\n", std::chrono::duration_cast(end - start).count()); } { auto start = std::chrono::steady_clock::now(); asio::io_context ctx{BOOST_ASIO_CONCURRENCY_HINT_1}; asio::co_spawn(ctx, awtest(), asio::detached); ctx.run(); auto end = std::chrono::steady_clock::now(); printf("awaitable: %ld ms\n", std::chrono::duration_cast(end - start).count()); } #if defined(BOOST_COBALT_BENCH_WITH_CONTEXT) { auto start = std::chrono::steady_clock::now(); asio::io_context ctx{BOOST_ASIO_CONCURRENCY_HINT_1}; asio::spawn(ctx, stest, asio::detached); ctx.run(); auto end = std::chrono::steady_clock::now(); printf("stackful : %ld ms\n", std::chrono::duration_cast(end - start).count()); } #endif return 0; }