Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions benchmark/simple/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@ add_example(simple_sc benchmark_simple_sc sc.cpp)

if (NOT IS_MSVC_2015)
add_example(simple_sml benchmark_simple_sml sml.cpp)
add_example(simple_co_sm benchmark_simple_co_sm co_sm.cpp)
endif()
101 changes: 101 additions & 0 deletions benchmark/simple/co_sm.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
//
// Copyright (c) 2016-2026 Kris Jusiak (kris at jusiak dot net)
//
// 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 <boost/sml.hpp>
#include <boost/sml/utility/co_sm.hpp>

#include "benchmark.hpp"

namespace sml = boost::sml;

struct play {};
struct end_pause {};
struct stop {};
struct pause {};
struct open_close {};
struct cd_detected {};

auto start_playback = [] {};
auto resume_playback = [] {};
auto close_drawer = [] {};
auto open_drawer = [] {};
auto stop_and_open = [] {};
auto stopped_again = [] {};
auto store_cd_info = [] {};
auto pause_playback = [] {};
auto stop_playback = [] {};

struct player {
auto operator()() const noexcept {
using namespace sml;
auto Empty = state<class Empty>;
auto Open = state<class Open>;
auto Stopped = state<class Stopped>;
auto Playing = state<class Playing>;
auto Pause = state<class Pause>;

// clang-format off
return make_transition_table(
Playing <= Stopped + event<play> / start_playback,
Playing <= Pause + event<end_pause> / resume_playback,
Empty <= Open + event<open_close> / close_drawer,
Open <= *Empty + event<open_close> / open_drawer,
Open <= Pause + event<open_close> / stop_and_open,
Open <= Stopped + event<open_close> / open_drawer,
Open <= Playing + event<open_close> / stop_and_open,
Pause <= Playing + event<pause> / pause_playback,
Stopped <= Playing + event<stop> / stop_playback,
Stopped <= Pause + event<stop> / stop_playback,
Stopped <= Empty + event<cd_detected> / store_cd_info,
Stopped <= Stopped + event<stop> / stopped_again
);
// clang-format on
}
};

int main() {
#if BOOST_SML_UTILITY_CO_SM_ENABLED
using co_sm_t =
sml::utility::co_sm<player, sml::utility::policy::coroutine_scheduler<sml::utility::policy::inline_scheduler>>;
co_sm_t sm{};

benchmark_execution_speed([&] {
for (auto i = 0; i < 1'000'000; ++i) {
sm.process_event_async(open_close{}).result();
sm.process_event_async(open_close{}).result();
sm.process_event_async(cd_detected{}).result();
sm.process_event_async(play{}).result();
sm.process_event_async(pause{}).result();
sm.process_event_async(end_pause{}).result();
sm.process_event_async(pause{}).result();
sm.process_event_async(stop{}).result();
sm.process_event_async(stop{}).result();
sm.process_event_async(open_close{}).result();
sm.process_event_async(open_close{}).result();
}
});
benchmark_memory_usage(sm);
#else
sml::sm<player> sm{};
benchmark_execution_speed([&] {
for (auto i = 0; i < 1'000'000; ++i) {
sm.process_event(open_close{});
sm.process_event(open_close{});
sm.process_event(cd_detected{});
sm.process_event(play{});
sm.process_event(pause{});
sm.process_event(end_pause{});
sm.process_event(pause{});
sm.process_event(stop{});
sm.process_event(stop{});
sm.process_event(open_close{});
sm.process_event(open_close{});
}
});
benchmark_memory_usage(sm);
#endif
}
Loading
Loading