Skip to content

Commit 5687b9c

Browse files
authored
Merge pull request #27 from joaquinbejar/issue-18-add-trade-id
#18: Unify ID model, move Id to utils, and expose prelude
2 parents ff932f0 + fa3c661 commit 5687b9c

33 files changed

+693
-889
lines changed

benches/concurrent/contention.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use criterion::{BenchmarkId, Criterion};
22
use pricelevel::{
3-
Hash32, OrderId, OrderType, OrderUpdate, PriceLevel, Side, TimeInForce, UuidGenerator,
3+
Hash32, Id, OrderType, OrderUpdate, PriceLevel, Side, TimeInForce, UuidGenerator,
44
};
55
use std::sync::{Arc, Barrier};
66
use std::thread;
@@ -105,12 +105,12 @@ fn measure_read_write_contention(
105105
}
106106
1 => {
107107
// Match against existing orders
108-
let taker_id = OrderId::from_u64(thread_id as u64 * 1_000_000 + i);
108+
let taker_id = Id::from_u64(thread_id as u64 * 1_000_000 + i);
109109
thread_price_level.match_order(2, taker_id, &thread_transaction_id_gen);
110110
}
111111
_ => {
112112
// Cancel an order
113-
let order_id = OrderId::from_u64(i % 500);
113+
let order_id = Id::from_u64(i % 500);
114114
let _ =
115115
thread_price_level.update_order(OrderUpdate::Cancel { order_id });
116116
}
@@ -197,7 +197,7 @@ fn measure_hot_spot_contention(
197197
0 => {
198198
// Cancel an order
199199
let _ = thread_price_level.update_order(OrderUpdate::Cancel {
200-
order_id: OrderId::from_u64(order_idx),
200+
order_id: Id::from_u64(order_idx),
201201
});
202202
}
203203
1 => {
@@ -209,13 +209,13 @@ fn measure_hot_spot_contention(
209209
2 => {
210210
// Update quantity
211211
let _ = thread_price_level.update_order(OrderUpdate::UpdateQuantity {
212-
order_id: OrderId::from_u64(order_idx),
212+
order_id: Id::from_u64(order_idx),
213213
new_quantity: 15,
214214
});
215215
}
216216
_ => {
217217
// Match operations
218-
let taker_id = OrderId::from_u64(thread_id as u64 * 1_000_000 + i);
218+
let taker_id = Id::from_u64(thread_id as u64 * 1_000_000 + i);
219219
thread_price_level.match_order(1, taker_id, &thread_transaction_id_gen);
220220
}
221221
}
@@ -246,7 +246,7 @@ fn measure_hot_spot_contention(
246246
#[allow(dead_code)]
247247
fn create_standard_order(id: u64, price: u128, quantity: u64) -> OrderType<()> {
248248
OrderType::Standard {
249-
id: OrderId::from_u64(id),
249+
id: Id::from_u64(id),
250250
price,
251251
quantity,
252252
side: Side::Buy,

benches/concurrent/register.rs

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use criterion::{BenchmarkId, Criterion, criterion_group};
22
use pricelevel::{
3-
Hash32, OrderId, OrderType, OrderUpdate, PegReferenceType, PriceLevel, Side, TimeInForce,
3+
Hash32, Id, OrderType, OrderUpdate, PegReferenceType, PriceLevel, Side, TimeInForce,
44
UuidGenerator,
55
};
66
use std::sync::{Arc, Barrier};
@@ -71,8 +71,7 @@ pub fn register_benchmarks(c: &mut Criterion) {
7171
Uuid::parse_str("6ba7b810-9dad-11d1-80b4-00c04fd430c8").unwrap();
7272
let transaction_id_generator = UuidGenerator::new(namespace);
7373
// Use different taker order IDs for each thread/iteration
74-
let taker_id =
75-
OrderId::from_u64(thread_id as u64 * 1_000_000 + iteration);
74+
let taker_id = Id::from_u64(thread_id as u64 * 1_000_000 + iteration);
7675
price_level.match_order(5, taker_id, &transaction_id_generator);
7776
},
7877
)
@@ -98,8 +97,7 @@ pub fn register_benchmarks(c: &mut Criterion) {
9897
iters,
9998
|price_level, thread_id, iteration| {
10099
// Each thread cancels a different order
101-
let order_id =
102-
OrderId::from_u64(thread_id as u64 * 100 + iteration % 100);
100+
let order_id = Id::from_u64(thread_id as u64 * 100 + iteration % 100);
103101
let _ = price_level.update_order(OrderUpdate::Cancel { order_id });
104102
},
105103
)
@@ -307,19 +305,19 @@ fn measure_concurrent_mixed_operations(thread_count: usize, iterations: u64) ->
307305
}
308306
1 => {
309307
// Match against existing orders
310-
let taker_id = OrderId::from_u64(thread_id as u64 * 1_000_000 + i);
308+
let taker_id = Id::from_u64(thread_id as u64 * 1_000_000 + i);
311309
thread_price_level.match_order(5, taker_id, &thread_transaction_id_gen);
312310
}
313311
2 => {
314312
// Cancel one of the initial orders
315-
let order_id = OrderId::from_u64(i % 200);
313+
let order_id = Id::from_u64(i % 200);
316314
let _ = thread_price_level.update_order(OrderUpdate::Cancel { order_id });
317315
}
318316
_ => {
319317
// Update quantity
320318
let base_id = thread_id as u64 * 1_000_000 + (i - 1);
321319
let _ = thread_price_level.update_order(OrderUpdate::UpdateQuantity {
322-
order_id: OrderId::from_u64(base_id),
320+
order_id: Id::from_u64(base_id),
323321
new_quantity: 20,
324322
});
325323
}
@@ -352,7 +350,7 @@ fn measure_concurrent_mixed_operations(thread_count: usize, iterations: u64) ->
352350
/// Create a standard limit order for testing
353351
fn create_standard_order(id: u64, price: u128, quantity: u64) -> OrderType<()> {
354352
OrderType::Standard {
355-
id: OrderId::from_u64(id),
353+
id: Id::from_u64(id),
356354
price,
357355
quantity,
358356
side: Side::Buy,
@@ -366,7 +364,7 @@ fn create_standard_order(id: u64, price: u128, quantity: u64) -> OrderType<()> {
366364
/// Create an iceberg order for testing
367365
fn create_iceberg_order(id: u64, price: u128, visible: u64, hidden: u64) -> OrderType<()> {
368366
OrderType::IcebergOrder {
369-
id: OrderId::from_u64(id),
367+
id: Id::from_u64(id),
370368
price,
371369
visible_quantity: visible,
372370
hidden_quantity: hidden,
@@ -381,7 +379,7 @@ fn create_iceberg_order(id: u64, price: u128, visible: u64, hidden: u64) -> Orde
381379
/// Create a post-only order for testing
382380
fn create_post_only_order(id: u64, price: u128, quantity: u64) -> OrderType<()> {
383381
OrderType::PostOnly {
384-
id: OrderId::from_u64(id),
382+
id: Id::from_u64(id),
385383
price,
386384
quantity,
387385
side: Side::Buy,
@@ -403,7 +401,7 @@ fn create_reserve_order(
403401
replenish_amount: Option<u64>,
404402
) -> OrderType<()> {
405403
OrderType::ReserveOrder {
406-
id: OrderId::from_u64(id),
404+
id: Id::from_u64(id),
407405
price,
408406
visible_quantity: visible,
409407
hidden_quantity: hidden,
@@ -421,7 +419,7 @@ fn create_reserve_order(
421419
/// Create a pegged order for testing
422420
fn create_pegged_order(id: u64, price: u128, quantity: u64) -> OrderType<()> {
423421
OrderType::PeggedOrder {
424-
id: OrderId::from_u64(id),
422+
id: Id::from_u64(id),
425423
price,
426424
quantity,
427425
side: Side::Buy,
@@ -440,7 +438,7 @@ fn setup_standard_orders(order_count: u64) -> PriceLevel {
440438

441439
for i in 0..order_count {
442440
let order = OrderType::Standard {
443-
id: OrderId::from_u64(i),
441+
id: Id::from_u64(i),
444442
price: 10000u128,
445443
quantity: 10,
446444
side: Side::Buy,

benches/price_level/add_orders.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use criterion::{BenchmarkId, Criterion};
2-
use pricelevel::{Hash32, OrderId, OrderType, PriceLevel, Side, TimeInForce};
2+
use pricelevel::{Hash32, Id, OrderType, PriceLevel, Side, TimeInForce};
33
use std::hint::black_box;
44

55
/// Register all benchmarks for adding orders to a price level
@@ -81,7 +81,7 @@ pub fn register_benchmarks(c: &mut Criterion) {
8181
/// Create a standard limit order for testing
8282
fn create_standard_order(id: u64, price: u128, quantity: u64) -> OrderType<()> {
8383
OrderType::Standard {
84-
id: OrderId::from_u64(id),
84+
id: Id::from_u64(id),
8585
price,
8686
quantity,
8787
side: Side::Buy,
@@ -95,7 +95,7 @@ fn create_standard_order(id: u64, price: u128, quantity: u64) -> OrderType<()> {
9595
/// Create an iceberg order for testing
9696
fn create_iceberg_order(id: u64, price: u128, visible: u64, hidden: u64) -> OrderType<()> {
9797
OrderType::IcebergOrder {
98-
id: OrderId::from_u64(id),
98+
id: Id::from_u64(id),
9999
price,
100100
visible_quantity: visible,
101101
hidden_quantity: hidden,
@@ -110,7 +110,7 @@ fn create_iceberg_order(id: u64, price: u128, visible: u64, hidden: u64) -> Orde
110110
/// Create a post-only order for testing
111111
fn create_post_only_order(id: u64, price: u128, quantity: u64) -> OrderType<()> {
112112
OrderType::PostOnly {
113-
id: OrderId::from_u64(id),
113+
id: Id::from_u64(id),
114114
price,
115115
quantity,
116116
side: Side::Buy,
@@ -132,7 +132,7 @@ fn create_reserve_order(
132132
replenish_amount: Option<u64>,
133133
) -> OrderType<()> {
134134
OrderType::ReserveOrder {
135-
id: OrderId::from_u64(id),
135+
id: Id::from_u64(id),
136136
price,
137137
visible_quantity: visible,
138138
hidden_quantity: hidden,
@@ -152,7 +152,7 @@ fn create_pegged_order(id: u64, price: u128, quantity: u64) -> OrderType<()> {
152152
use pricelevel::PegReferenceType;
153153

154154
OrderType::PeggedOrder {
155-
id: OrderId::from_u64(id),
155+
id: Id::from_u64(id),
156156
price,
157157
quantity,
158158
side: Side::Buy,

benches/price_level/match_orders.rs

Lines changed: 13 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use criterion::{BenchmarkId, Criterion};
2-
use pricelevel::{Hash32, OrderId, OrderType, PriceLevel, Side, TimeInForce, UuidGenerator};
2+
use pricelevel::{Hash32, Id, OrderType, PriceLevel, Side, TimeInForce, UuidGenerator};
33
use std::hint::black_box;
44
use uuid::Uuid;
55

@@ -14,11 +14,7 @@ pub fn register_benchmarks(c: &mut Criterion) {
1414
let price_level = setup_standard_orders(100);
1515
let namespace = Uuid::parse_str("6ba7b810-9dad-11d1-80b4-00c04fd430c8").unwrap();
1616
let transaction_id_generator = UuidGenerator::new(namespace);
17-
black_box(price_level.match_order(
18-
50,
19-
OrderId::from_u64(999),
20-
&transaction_id_generator,
21-
));
17+
black_box(price_level.match_order(50, Id::from_u64(999), &transaction_id_generator));
2218
})
2319
});
2420

@@ -28,11 +24,7 @@ pub fn register_benchmarks(c: &mut Criterion) {
2824
let price_level = setup_iceberg_orders(100);
2925
let namespace = Uuid::parse_str("6ba7b810-9dad-11d1-80b4-00c04fd430c8").unwrap();
3026
let transaction_id_generator = UuidGenerator::new(namespace);
31-
black_box(price_level.match_order(
32-
75,
33-
OrderId::from_u64(999),
34-
&transaction_id_generator,
35-
));
27+
black_box(price_level.match_order(75, Id::from_u64(999), &transaction_id_generator));
3628
})
3729
});
3830

@@ -42,11 +34,7 @@ pub fn register_benchmarks(c: &mut Criterion) {
4234
let price_level = setup_reserve_orders(100);
4335
let namespace = Uuid::parse_str("6ba7b810-9dad-11d1-80b4-00c04fd430c8").unwrap();
4436
let transaction_id_generator = UuidGenerator::new(namespace);
45-
black_box(price_level.match_order(
46-
60,
47-
OrderId::from_u64(999),
48-
&transaction_id_generator,
49-
));
37+
black_box(price_level.match_order(60, Id::from_u64(999), &transaction_id_generator));
5038
})
5139
});
5240

@@ -56,11 +44,7 @@ pub fn register_benchmarks(c: &mut Criterion) {
5644
let price_level = setup_mixed_orders(100);
5745
let namespace = Uuid::parse_str("6ba7b810-9dad-11d1-80b4-00c04fd430c8").unwrap();
5846
let transaction_id_generator = UuidGenerator::new(namespace);
59-
black_box(price_level.match_order(
60-
100,
61-
OrderId::from_u64(999),
62-
&transaction_id_generator,
63-
));
47+
black_box(price_level.match_order(100, Id::from_u64(999), &transaction_id_generator));
6448
})
6549
});
6650

@@ -77,7 +61,7 @@ pub fn register_benchmarks(c: &mut Criterion) {
7761
let transaction_id_generator = UuidGenerator::new(namespace);
7862
black_box(price_level.match_order(
7963
match_quantity,
80-
OrderId::from_u64(999),
64+
Id::from_u64(999),
8165
&transaction_id_generator,
8266
));
8367
})
@@ -98,7 +82,7 @@ pub fn register_benchmarks(c: &mut Criterion) {
9882
let transaction_id_generator = UuidGenerator::new(namespace);
9983
black_box(price_level.match_order(
10084
match_quantity,
101-
OrderId::from_u64(999),
85+
Id::from_u64(999),
10286
&transaction_id_generator,
10387
));
10488
})
@@ -117,7 +101,7 @@ fn setup_standard_orders(order_count: u64) -> PriceLevel {
117101

118102
for i in 0..order_count {
119103
let order = OrderType::Standard {
120-
id: OrderId::from_u64(i),
104+
id: Id::from_u64(i),
121105
price: 10000u128,
122106
quantity: 10,
123107
side: Side::Buy,
@@ -138,7 +122,7 @@ fn setup_iceberg_orders(order_count: u64) -> PriceLevel {
138122

139123
for i in 0..order_count {
140124
let order = OrderType::IcebergOrder {
141-
id: OrderId::from_u64(i),
125+
id: Id::from_u64(i),
142126
price: 10000u128,
143127
visible_quantity: 5,
144128
hidden_quantity: 15,
@@ -160,7 +144,7 @@ fn setup_reserve_orders(order_count: u64) -> PriceLevel {
160144

161145
for i in 0..order_count {
162146
let order = OrderType::ReserveOrder {
163-
id: OrderId::from_u64(i),
147+
id: Id::from_u64(i),
164148
price: 10000u128,
165149
visible_quantity: 5,
166150
hidden_quantity: 15,
@@ -186,7 +170,7 @@ fn setup_mixed_orders(order_count: u64) -> PriceLevel {
186170
for i in 0..order_count {
187171
let order = match i % 3 {
188172
0 => OrderType::Standard {
189-
id: OrderId::from_u64(i),
173+
id: Id::from_u64(i),
190174
price: 10000u128,
191175
quantity: 10,
192176
side: Side::Buy,
@@ -196,7 +180,7 @@ fn setup_mixed_orders(order_count: u64) -> PriceLevel {
196180
extra_fields: (),
197181
},
198182
1 => OrderType::IcebergOrder {
199-
id: OrderId::from_u64(i),
183+
id: Id::from_u64(i),
200184
price: 10000u128,
201185
visible_quantity: 5,
202186
hidden_quantity: 15,
@@ -207,7 +191,7 @@ fn setup_mixed_orders(order_count: u64) -> PriceLevel {
207191
extra_fields: (),
208192
},
209193
_ => OrderType::ReserveOrder {
210-
id: OrderId::from_u64(i),
194+
id: Id::from_u64(i),
211195
price: 10000u128,
212196
visible_quantity: 5,
213197
hidden_quantity: 15,

0 commit comments

Comments
 (0)