@@ -92,6 +92,7 @@ class OrderBook {
9292 */
9393 Order* add_order (const NewOrderRequest& req) {
9494 // Allocate from arena (zero malloc)
95+ ts_ = now (); // one clock read per event; reused for every fill
9596 Order* order = order_arena_.allocate ();
9697 new (order) Order{};
9798
@@ -105,8 +106,8 @@ class OrderBook {
105106 order->quantity = req.quantity ;
106107 order->leaves_qty = req.quantity ;
107108 order->filled_qty = 0 ;
108- order->entry_time = now () ;
109- order->last_update = order-> entry_time ;
109+ order->entry_time = ts_ ;
110+ order->last_update = ts_ ;
110111 order->status = OrderStatus::New;
111112 std::memcpy (order->symbol , req.symbol , sizeof (order->symbol ));
112113
@@ -136,14 +137,14 @@ class OrderBook {
136137 case OrderType::Market:
137138 case OrderType::IOC :
138139 // Cancel unfilled remainder
139- order->cancel ();
140+ order->cancel (ts_ );
140141 order_index_.erase (order->id );
141142 notify_order (*order);
142143 break ;
143144 case OrderType::FOK :
144145 // Should have been fully filled or not at all
145146 // (FOK pre-check happens in match())
146- order->cancel ();
147+ order->cancel (ts_ );
147148 order_index_.erase (order->id );
148149 notify_order (*order);
149150 break ;
@@ -201,6 +202,7 @@ class OrderBook {
201202 Order* order = it->second ;
202203 if (!order->is_active ()) return false ;
203204
205+ ts_ = now ();
204206 bool price_changed = (req.new_price != 0 && req.new_price != order->price );
205207 bool qty_increased = (req.new_quantity != 0 && req.new_quantity > order->leaves_qty );
206208
@@ -215,7 +217,7 @@ class OrderBook {
215217 }
216218 order->sequence = next_sequence_++;
217219 order->status = OrderStatus::Amended;
218- order->last_update = now () ;
220+ order->last_update = ts_ ;
219221
220222 // Re-match then rest
221223 match (order);
@@ -228,7 +230,7 @@ class OrderBook {
228230 order->leaves_qty = req.new_quantity ;
229231 order->quantity -= reduction;
230232 order->status = OrderStatus::Amended;
231- order->last_update = now () ;
233+ order->last_update = ts_ ;
232234
233235 // Update level aggregate
234236 auto & levels = order->is_buy () ? bids_ : asks_;
@@ -405,7 +407,7 @@ class OrderBook {
405407 trade.sequence = next_sequence_++;
406408 trade.price = resting->price ; // Resting order's price (price improvement)
407409 trade.quantity = fill_qty;
408- trade.exec_time = now () ;
410+ trade.exec_time = ts_ ;
409411 trade.aggressor = incoming->side ;
410412 std::memcpy (trade.symbol , incoming->symbol , sizeof (trade.symbol ));
411413
@@ -422,8 +424,8 @@ class OrderBook {
422424 // because fill() modifies the order in-place and the level still references it.
423425 // Learned this the hard way (assertion failures in PriceLevel::reduce_quantity).
424426 level.reduce_quantity (fill_qty);
425- incoming->fill (fill_qty);
426- resting->fill (fill_qty);
427+ incoming->fill (fill_qty, ts_ );
428+ resting->fill (fill_qty, ts_ );
427429
428430 // Notify
429431 notify_trade (trade);
@@ -536,7 +538,7 @@ class OrderBook {
536538 o->tif = TimeInForce::GTC ;
537539 }
538540 o->sequence = next_sequence_++;
539- o->last_update = now () ;
541+ o->last_update = ts_ ;
540542 ++stop_triggered_count_;
541543
542544 match (o);
@@ -545,7 +547,7 @@ class OrderBook {
545547 if (o->type == OrderType::Limit) {
546548 rest_order (o);
547549 } else {
548- o->cancel ();
550+ o->cancel (ts_ );
549551 order_index_.erase (o->id );
550552 notify_order (*o);
551553 }
@@ -605,6 +607,8 @@ class OrderBook {
605607 std::unordered_map<OrderId, Order*> order_index_;
606608 ArenaAllocator<Order> order_arena_;
607609
610+ Timestamp ts_{}; // wall-clock captured once per inbound event (hot path)
611+
608612 SeqNum next_sequence_ = 1 ;
609613 uint64_t trade_count_ = 0 ;
610614 uint64_t total_volume_ = 0 ;
0 commit comments