77#include " core/order_book.h"
88#include " spdlog/spdlog.h"
99
10- class OrderBookFixture : public benchmark ::Fixture {
10+ class PriceUpdateFixture : public benchmark ::Fixture {
1111 public:
12+ // / @brief deterministically build an initial, fully-populated, order book
1213 void SetUp ([[maybe_unused]] const benchmark::State& state) override {
13- // deterministically build an initial, fully-populated, order book
1414 book_ = std::make_unique<core::OrderBook>(bids_, asks_);
1515
1616 // bids
1717 uint64_t bid_px = MID_PRICE - 1 ;
18- for (uint64_t i = 0 ; i <= DEPTH_LEVELS; ++i) {
18+ for (uint64_t i = 0 ; i < DEPTH_LEVELS; ++i) {
1919 auto msg = FIX44::MarketDataIncrementalRefresh ();
2020 auto change = FIX44::MarketDataIncrementalRefresh::NoMDEntries ();
2121 change.set (FIX::Symbol (" BTCUSDT" ));
@@ -25,14 +25,14 @@ class OrderBookFixture : public benchmark::Fixture {
2525 if (bid_px < MID_PRICE - DEPTH_LEVELS) {
2626 bid_px = MID_PRICE - 1 ;
2727 }
28- change.set (FIX::MDEntrySize (i ));
28+ change.set (FIX::MDEntrySize (1 ));
2929 msg.addGroup (change);
3030 book_->apply_increment (msg, false );
3131 }
3232
3333 // offers
3434 uint64_t ask_px = MID_PRICE + 1 ;
35- for (uint64_t i = 0 ; i <= DEPTH_LEVELS; ++i) {
35+ for (uint64_t i = 0 ; i < DEPTH_LEVELS; ++i) {
3636 auto msg = FIX44::MarketDataIncrementalRefresh ();
3737 auto change = FIX44::MarketDataIncrementalRefresh::NoMDEntries ();
3838 change.set (FIX::Symbol (" BTCUSDT" ));
@@ -42,63 +42,73 @@ class OrderBookFixture : public benchmark::Fixture {
4242 if (ask_px > MID_PRICE + DEPTH_LEVELS) {
4343 ask_px = MID_PRICE + 1 ;
4444 }
45- change.set (FIX::MDEntrySize (i ));
45+ change.set (FIX::MDEntrySize (1 ));
4646 msg.addGroup (change);
4747 book_->apply_increment (msg, false );
4848
4949 // asks_[MID_PRICE + i] = 1;
5050 }
51+
52+ // test messages
53+ uint8_t tick_tock = 0 ;
54+ uint64_t volume = 1 ;
55+ bid_px = MID_PRICE - 1 ;
56+ ask_px = MID_PRICE + 1 ;
57+ for (int i = 0 ; i < MSG_COUNT; i++) {
58+ auto msg = FIX44::MarketDataIncrementalRefresh ();
59+ auto change = FIX44::MarketDataIncrementalRefresh::NoMDEntries ();
60+ change.set (FIX::Symbol (" BTCUSDT" ));
61+ change.set (FIX::MDUpdateAction (FIX::MDUpdateAction_NEW));
62+ if (tick_tock == 0 ) {
63+ change.set (FIX::MDEntryType (FIX::MDEntryType_BID));
64+ change.set (FIX::MDEntryPx (bid_px--));
65+ if (bid_px < MID_PRICE - DEPTH_LEVELS) {
66+ bid_px = MID_PRICE - 1 ;
67+ }
68+ change.set (FIX::MDEntrySize (volume));
69+ tick_tock = 1 ;
70+ } else {
71+ change.set (FIX::MDEntryType (FIX::MDEntryType_OFFER));
72+ change.set (FIX::MDEntryPx (ask_px++));
73+ if (ask_px > MID_PRICE + DEPTH_LEVELS) {
74+ ask_px = MID_PRICE + 1 ;
75+ }
76+ change.set (FIX::MDEntrySize (volume++));
77+ tick_tock = 0 ;
78+ }
79+ msg.addGroup (change);
80+ test_messages_[i] = msg;
81+ }
5182 }
5283
5384 void TearDown ([[maybe_unused]] const benchmark::State& state) override {
54- const auto vec = book_->to_vector ();
55- spdlog::info (" Levels: [{}]" , fmt::join (vec, " , " ));
85+ // const auto vec = book_->to_vector();
86+ // spdlog::info("Levels: [{}]", fmt::join(vec, ", "));
5687 }
5788
5889 // order book
5990 std::unique_ptr<core::OrderBook> book_;
6091 absl::btree_map<uint64_t , uint64_t , std::greater<>> bids_;
6192 absl::btree_map<uint64_t , uint64_t > asks_;
62- //
6393 static constexpr uint64_t DEPTH_LEVELS = 500 ;
6494 static constexpr uint64_t MID_PRICE = 100'000 ;
95+ // test messages
96+ static constexpr int MSG_COUNT = 1000 ;
97+ std::array<FIX44::MarketDataIncrementalRefresh, 1000 > test_messages_;
6598};
6699
67- BENCHMARK_DEFINE_F (OrderBookFixture, BM_AddOrder)(benchmark::State& state) {
68- FIX44::MarketDataIncrementalRefresh msg;
69- FIX44::MarketDataIncrementalRefresh::NoMDEntries change;
70- uint8_t tick_tock = 0 ;
71- uint64_t volume = 1 ;
72- uint64_t bid_px = MID_PRICE - 1 ;
73- uint64_t ask_px = MID_PRICE + 1 ;
100+ // / @brief deterministically populate the order book
101+ BENCHMARK_DEFINE_F (PriceUpdateFixture, BM_PriceUpdate)(benchmark::State& state) {
102+ int i = 0 ;
74103 for (auto _ : state) {
75- msg = FIX44::MarketDataIncrementalRefresh ();
76- change = FIX44::MarketDataIncrementalRefresh::NoMDEntries ();
77- change.set (FIX::Symbol (" BTCUSDT" ));
78- change.set (FIX::MDUpdateAction (FIX::MDUpdateAction_NEW));
79- if (tick_tock == 0 ) {
80- change.set (FIX::MDEntryType (FIX::MDEntryType_BID));
81- change.set (FIX::MDEntryPx (bid_px--));
82- if (bid_px < MID_PRICE - DEPTH_LEVELS) {
83- bid_px = MID_PRICE - 1 ;
84- }
85- change.set (FIX::MDEntrySize (volume));
86- tick_tock = 1 ;
87- } else {
88- change.set (FIX::MDEntryType (FIX::MDEntryType_OFFER));
89- change.set (FIX::MDEntryPx (ask_px++));
90- if (ask_px > MID_PRICE + DEPTH_LEVELS) {
91- ask_px = MID_PRICE + 1 ;
92- }
93- change.set (FIX::MDEntrySize (volume++));
94- tick_tock = 0 ;
104+ book_->apply_increment (test_messages_[i], false );
105+ if (i == MSG_COUNT - 1 ) {
106+ i = 0 ;
95107 }
96- msg.addGroup (change);
97- book_->apply_increment (msg, false );
98108 }
99109
100110 state.counters [" Updates/sec" ] =
101111 benchmark::Counter (state.iterations (), benchmark::Counter::kIsRate );
102112}
103113
104- BENCHMARK_REGISTER_F (OrderBookFixture, BM_AddOrder )->Iterations(500'000 );
114+ BENCHMARK_REGISTER_F (PriceUpdateFixture, BM_PriceUpdate )->Iterations(500'000 );
0 commit comments