Skip to content

Commit 6344f6e

Browse files
authored
test: Add a few new benchmarks that exercise the MemoryManager which is often how StableStructures are used (#253)
Also fix the 10mb benchmark, previously we added 200 10**kb** values, now we'll add 20 10**mb** values (like the benchmark description says). 200 10mb values crash the benchmark so let's stick with 20.
1 parent 3f6ec4a commit 6344f6e

File tree

3 files changed

+107
-14
lines changed

3 files changed

+107
-14
lines changed

benchmarks/src/btreemap.rs

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::Random;
22
use canbench_rs::{bench, bench_fn, BenchResult};
3-
use ic_stable_structures::{storable::Blob, BTreeMap, DefaultMemoryImpl, Storable};
3+
use ic_stable_structures::memory_manager::{MemoryId, MemoryManager};
4+
use ic_stable_structures::{storable::Blob, BTreeMap, DefaultMemoryImpl, Memory, Storable};
45
use std::ops::Bound;
56
use tiny_rng::{Rand, Rng};
67

@@ -164,12 +165,24 @@ pub fn btreemap_insert_blob_1024_512_v2() -> BenchResult {
164165
insert_blob_helper_v2::<1024, 512>()
165166
}
166167

168+
#[bench(raw)]
169+
pub fn btreemap_insert_blob_1024_512_v2_mem_manager() -> BenchResult {
170+
insert_blob_helper_v2_mem_manager::<1024, 512>()
171+
}
172+
167173
#[bench(raw)]
168174
pub fn btreemap_insert_u64_u64() -> BenchResult {
169175
let btree = BTreeMap::new_v1(DefaultMemoryImpl::default());
170176
insert_helper::<u64, u64>(btree)
171177
}
172178

179+
#[bench(raw)]
180+
pub fn btreemap_insert_u64_u64_mem_manager() -> BenchResult {
181+
let memory_manager = MemoryManager::init(DefaultMemoryImpl::default());
182+
let btree = BTreeMap::new(memory_manager.get(MemoryId::new(42)));
183+
insert_helper::<u64, u64>(btree)
184+
}
185+
173186
#[bench(raw)]
174187
pub fn btreemap_insert_u64_u64_v2() -> BenchResult {
175188
let btree = BTreeMap::new(DefaultMemoryImpl::default());
@@ -204,16 +217,20 @@ pub fn btreemap_insert_blob_8_u64_v2() -> BenchResult {
204217
pub fn btreemap_insert_10mib_values() -> BenchResult {
205218
let mut btree = BTreeMap::new(DefaultMemoryImpl::default());
206219

207-
// Insert 200 10MiB values.
220+
// Insert 20 10MiB values.
208221
let mut rng = Rng::from_seed(0);
209222
let mut values = vec![];
210-
for _ in 0..200 {
211-
values.push(rng.iter(Rand::rand_u8).take(10 * 1024).collect::<Vec<_>>());
223+
for _ in 0..20 {
224+
values.push(
225+
rng.iter(Rand::rand_u8)
226+
.take(10 * 1024 * 1024)
227+
.collect::<Vec<_>>(),
228+
);
212229
}
213230

214231
bench_fn(|| {
215232
let mut i = 0u64;
216-
for value in values.into_iter() {
233+
for value in values {
217234
btree.insert(i, value);
218235
i += 1;
219236
}
@@ -543,6 +560,11 @@ pub fn btreemap_get_blob_512_1024_v2() -> BenchResult {
543560
get_blob_helper_v2::<512, 1024>()
544561
}
545562

563+
#[bench(raw)]
564+
pub fn btreemap_get_blob_512_1024_v2_mem_manager() -> BenchResult {
565+
get_blob_helper_v2_mem_manager::<512, 1024>()
566+
}
567+
546568
#[bench(raw)]
547569
pub fn btreemap_get_u64_u64() -> BenchResult {
548570
let btree = BTreeMap::new_v1(DefaultMemoryImpl::default());
@@ -555,6 +577,13 @@ pub fn btreemap_get_u64_u64_v2() -> BenchResult {
555577
get_helper::<u64, u64>(btree)
556578
}
557579

580+
#[bench(raw)]
581+
pub fn btreemap_get_u64_u64_v2_mem_manager() -> BenchResult {
582+
let memory_manager = MemoryManager::init(DefaultMemoryImpl::default());
583+
let btree = BTreeMap::new(memory_manager.get(MemoryId::new(42)));
584+
get_helper::<u64, u64>(btree)
585+
}
586+
558587
#[bench(raw)]
559588
pub fn btreemap_get_u64_blob_8() -> BenchResult {
560589
let btree = BTreeMap::new_v1(DefaultMemoryImpl::default());
@@ -590,9 +619,15 @@ fn insert_blob_helper_v2<const K: usize, const V: usize>() -> BenchResult {
590619
insert_helper::<Blob<K>, Blob<V>>(btree)
591620
}
592621

622+
fn insert_blob_helper_v2_mem_manager<const K: usize, const V: usize>() -> BenchResult {
623+
let memory_manager = MemoryManager::init(DefaultMemoryImpl::default());
624+
let btree = BTreeMap::new(memory_manager.get(MemoryId::new(42)));
625+
insert_helper::<Blob<K>, Blob<V>>(btree)
626+
}
627+
593628
// Profiles inserting a large number of random blobs into a btreemap.
594629
fn insert_helper<K: Clone + Ord + Storable + Random, V: Storable + Random>(
595-
mut btree: BTreeMap<K, V, DefaultMemoryImpl>,
630+
mut btree: BTreeMap<K, V, impl Memory>,
596631
) -> BenchResult {
597632
let num_keys = 10_000;
598633
let mut rng = Rng::from_seed(0);
@@ -640,8 +675,14 @@ fn get_blob_helper_v2<const K: usize, const V: usize>() -> BenchResult {
640675
get_helper::<Blob<K>, Blob<V>>(btree)
641676
}
642677

678+
fn get_blob_helper_v2_mem_manager<const K: usize, const V: usize>() -> BenchResult {
679+
let memory_manager = MemoryManager::init(DefaultMemoryImpl::default());
680+
let btree = BTreeMap::new(memory_manager.get(MemoryId::new(42)));
681+
get_helper::<Blob<K>, Blob<V>>(btree)
682+
}
683+
643684
fn get_helper<K: Clone + Ord + Storable + Random, V: Storable + Random>(
644-
mut btree: BTreeMap<K, V, DefaultMemoryImpl>,
685+
mut btree: BTreeMap<K, V, impl Memory>,
645686
) -> BenchResult {
646687
let num_keys = 10_000;
647688
let mut rng = Rng::from_seed(0);

benchmarks/src/vec.rs

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
use crate::Random;
22
use canbench_rs::{bench, bench_fn, BenchResult};
3+
use ic_stable_structures::memory_manager::{MemoryId, MemoryManager};
34
use ic_stable_structures::storable::Blob;
4-
use ic_stable_structures::{DefaultMemoryImpl, StableVec, Storable};
5+
use ic_stable_structures::{DefaultMemoryImpl, Memory, StableVec, Storable};
56
use tiny_rng::{Rand, Rng};
67

78
#[bench(raw)]
@@ -44,6 +45,11 @@ pub fn vec_get_blob_4() -> BenchResult {
4445
vec_get_blob::<4>()
4546
}
4647

48+
#[bench(raw)]
49+
pub fn vec_get_blob_4_mem_manager() -> BenchResult {
50+
vec_get_blob_mem_manager::<4>()
51+
}
52+
4753
#[bench(raw)]
4854
pub fn vec_get_blob_8() -> BenchResult {
4955
vec_get_blob::<8>()
@@ -64,14 +70,19 @@ pub fn vec_get_blob_64() -> BenchResult {
6470
vec_get_blob::<64>()
6571
}
6672

73+
#[bench(raw)]
74+
pub fn vec_get_blob_64_mem_manager() -> BenchResult {
75+
vec_get_blob_mem_manager::<64>()
76+
}
77+
6778
#[bench(raw)]
6879
pub fn vec_get_blob_128() -> BenchResult {
6980
vec_get_blob::<128>()
7081
}
7182

7283
#[bench(raw)]
7384
pub fn vec_get_u64() -> BenchResult {
74-
vec_get::<u64>()
85+
vec_get::<u64>(DefaultMemoryImpl::default())
7586
}
7687

7788
fn vec_insert_blob<const N: usize>() -> BenchResult {
@@ -97,12 +108,17 @@ fn vec_insert<T: Storable + Random>() -> BenchResult {
97108
}
98109

99110
fn vec_get_blob<const N: usize>() -> BenchResult {
100-
vec_get::<Blob<N>>()
111+
vec_get::<Blob<N>>(DefaultMemoryImpl::default())
112+
}
113+
114+
fn vec_get_blob_mem_manager<const N: usize>() -> BenchResult {
115+
let memory_manager = MemoryManager::init(DefaultMemoryImpl::default());
116+
vec_get::<Blob<N>>(memory_manager.get(MemoryId::new(42)))
101117
}
102118

103-
fn vec_get<T: Storable + Random>() -> BenchResult {
119+
fn vec_get<T: Storable + Random>(memory: impl Memory) -> BenchResult {
104120
let num_items = 10_000;
105-
let svec: StableVec<T, _> = StableVec::new(DefaultMemoryImpl::default()).unwrap();
121+
let svec: StableVec<T, _> = StableVec::new(memory).unwrap();
106122

107123
let mut rng = Rng::from_seed(0);
108124

canbench_results.yml

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,12 @@ benches:
7171
heap_increase: 0
7272
stable_memory_increase: 0
7373
scopes: {}
74+
btreemap_get_blob_512_1024_v2_mem_manager:
75+
total:
76+
instructions: 3164909208
77+
heap_increase: 0
78+
stable_memory_increase: 0
79+
scopes: { }
7480
btreemap_get_blob_64_1024:
7581
total:
7682
instructions: 572513751
@@ -130,12 +136,18 @@ benches:
130136
instructions: 255485892
131137
heap_increase: 0
132138
stable_memory_increase: 0
139+
scopes: { }
140+
btreemap_get_u64_u64_v2_mem_manager:
141+
total:
142+
instructions: 673752904
143+
heap_increase: 0
144+
stable_memory_increase: 0
133145
scopes: {}
134146
btreemap_insert_10mib_values:
135147
total:
136-
instructions: 82015559
148+
instructions: 5251584111
137149
heap_increase: 0
138-
stable_memory_increase: 32
150+
stable_memory_increase: 3613
139151
scopes: {}
140152
btreemap_insert_blob_1024_128:
141153
total:
@@ -208,6 +220,12 @@ benches:
208220
instructions: 5070548871
209221
heap_increase: 0
210222
stable_memory_increase: 261
223+
scopes: { }
224+
btreemap_insert_blob_1024_512_v2_mem_manager:
225+
total:
226+
instructions: 6292667075
227+
heap_increase: 0
228+
stable_memory_increase: 256
211229
scopes: {}
212230
btreemap_insert_blob_1024_64:
213231
total:
@@ -359,6 +377,12 @@ benches:
359377
heap_increase: 0
360378
stable_memory_increase: 7
361379
scopes: {}
380+
btreemap_insert_u64_u64_mem_manager:
381+
total:
382+
instructions: 1019612837
383+
heap_increase: 0
384+
stable_memory_increase: 0
385+
scopes: { }
362386
btreemap_insert_u64_u64_v2:
363387
total:
364388
instructions: 421501977
@@ -635,11 +659,23 @@ benches:
635659
heap_increase: 0
636660
stable_memory_increase: 0
637661
scopes: {}
662+
vec_get_blob_4_mem_manager:
663+
total:
664+
instructions: 14476122
665+
heap_increase: 0
666+
stable_memory_increase: 0
667+
scopes: { }
638668
vec_get_blob_64:
639669
total:
640670
instructions: 12960294
641671
heap_increase: 0
642672
stable_memory_increase: 0
673+
scopes: { }
674+
vec_get_blob_64_mem_manager:
675+
total:
676+
instructions: 24146389
677+
heap_increase: 0
678+
stable_memory_increase: 0
643679
scopes: {}
644680
vec_get_blob_8:
645681
total:

0 commit comments

Comments
 (0)