55use std:: hint:: black_box;
66
77use criterion:: { Criterion , criterion_group, criterion_main} ;
8+ use fvm_ipld_blockstore:: { Blockstore , MemoryBlockstore } ;
89use fvm_ipld_encoding:: tuple:: * ;
910use fvm_ipld_hamt:: Hamt ;
1011
12+ const BIT_WIDTH : u32 = 5 ;
1113const ITEM_COUNT : u8 = 40 ;
1214
1315// Struct to simulate a reasonable amount of data per value into the amt
@@ -37,8 +39,8 @@ impl BenchData {
3739fn insert ( c : & mut Criterion ) {
3840 c. bench_function ( "HAMT bulk insert (no flush)" , |b| {
3941 b. iter ( || {
40- let db = fvm_ipld_blockstore :: MemoryBlockstore :: default ( ) ;
41- let mut a = Hamt :: < _ , _ > :: new_with_bit_width ( & db, 5 ) ;
42+ let db = MemoryBlockstore :: default ( ) ;
43+ let mut a = Hamt :: < _ , _ > :: new_with_bit_width ( & db, BIT_WIDTH ) ;
4244
4345 for i in 0 ..black_box ( ITEM_COUNT ) {
4446 a. set ( black_box ( vec ! [ i; 20 ] . into ( ) ) , black_box ( BenchData :: new ( i) ) )
@@ -51,12 +53,12 @@ fn insert(c: &mut Criterion) {
5153fn insert_load_flush ( c : & mut Criterion ) {
5254 c. bench_function ( "HAMT bulk insert with flushing and loading" , |b| {
5355 b. iter ( || {
54- let db = fvm_ipld_blockstore :: MemoryBlockstore :: default ( ) ;
55- let mut empt = Hamt :: < _ , ( ) > :: new_with_bit_width ( & db, 5 ) ;
56+ let db = MemoryBlockstore :: default ( ) ;
57+ let mut empt = Hamt :: < _ , ( ) > :: new_with_bit_width ( & db, BIT_WIDTH ) ;
5658 let mut cid = empt. flush ( ) . unwrap ( ) ;
5759
5860 for i in 0 ..black_box ( ITEM_COUNT ) {
59- let mut a = Hamt :: < _ , _ > :: load_with_bit_width ( & cid, & db, 5 ) . unwrap ( ) ;
61+ let mut a = Hamt :: < _ , _ > :: load_with_bit_width ( & cid, & db, BIT_WIDTH ) . unwrap ( ) ;
6062 a. set ( black_box ( vec ! [ i; 20 ] . into ( ) ) , black_box ( BenchData :: new ( i) ) )
6163 . unwrap ( ) ;
6264 cid = a. flush ( ) . unwrap ( ) ;
@@ -66,16 +68,13 @@ fn insert_load_flush(c: &mut Criterion) {
6668}
6769
6870fn delete ( c : & mut Criterion ) {
69- let db = fvm_ipld_blockstore:: MemoryBlockstore :: default ( ) ;
70- let mut a = Hamt :: < _ , _ > :: new_with_bit_width ( & db, 5 ) ;
71- for i in 0 ..black_box ( ITEM_COUNT ) {
72- a. set ( vec ! [ i; 20 ] . into ( ) , BenchData :: new ( i) ) . unwrap ( ) ;
73- }
71+ let db = MemoryBlockstore :: default ( ) ;
72+ let mut a = setup_hamt ( & db) ;
7473 let cid = a. flush ( ) . unwrap ( ) ;
7574
7675 c. bench_function ( "HAMT deleting all nodes" , |b| {
7776 b. iter ( || {
78- let mut a = Hamt :: < _ , BenchData > :: load_with_bit_width ( & cid, & db, 5 ) . unwrap ( ) ;
77+ let mut a = Hamt :: < _ , BenchData > :: load_with_bit_width ( & cid, & db, BIT_WIDTH ) . unwrap ( ) ;
7978 for i in 0 ..black_box ( ITEM_COUNT ) {
8079 a. delete ( black_box ( [ i; 20 ] . as_ref ( ) ) ) . unwrap ( ) ;
8180 }
@@ -84,20 +83,47 @@ fn delete(c: &mut Criterion) {
8483}
8584
8685fn for_each ( c : & mut Criterion ) {
87- let db = fvm_ipld_blockstore:: MemoryBlockstore :: default ( ) ;
88- let mut a = Hamt :: < _ , _ > :: new_with_bit_width ( & db, 5 ) ;
89- for i in 0 ..black_box ( ITEM_COUNT ) {
90- a. set ( vec ! [ i; 20 ] . into ( ) , BenchData :: new ( i) ) . unwrap ( ) ;
91- }
86+ let db = MemoryBlockstore :: default ( ) ;
87+ let mut a = setup_hamt ( & db) ;
9288 let cid = a. flush ( ) . unwrap ( ) ;
9389
9490 c. bench_function ( "HAMT for_each function" , |b| {
9591 b. iter ( || {
96- let a = Hamt :: < _ , _ > :: load_with_bit_width ( & cid, & db, 5 ) . unwrap ( ) ;
92+ let a = Hamt :: < _ , _ > :: load_with_bit_width ( & cid, & db, BIT_WIDTH ) . unwrap ( ) ;
9793 black_box ( a) . for_each ( |_k, _v : & BenchData | Ok ( ( ) ) ) . unwrap ( ) ;
9894 } )
9995 } ) ;
10096}
10197
102- criterion_group ! ( benches, insert, insert_load_flush, delete, for_each) ;
98+ fn for_each_cacheless ( c : & mut Criterion ) {
99+ let db = MemoryBlockstore :: default ( ) ;
100+ let mut a = setup_hamt ( & db) ;
101+ let cid = a. flush ( ) . unwrap ( ) ;
102+
103+ c. bench_function ( "HAMT for_each_cacheless function" , |b| {
104+ b. iter ( || {
105+ let a = Hamt :: < _ , _ > :: load_with_bit_width ( & cid, & db, BIT_WIDTH ) . unwrap ( ) ;
106+ black_box ( a)
107+ . for_each_cacheless ( |_k, _v : & BenchData | Ok ( ( ) ) )
108+ . unwrap ( ) ;
109+ } )
110+ } ) ;
111+ }
112+
113+ fn setup_hamt < BS : Blockstore > ( db : & BS ) -> Hamt < & BS , BenchData > {
114+ let mut a = Hamt :: < _ , _ > :: new_with_bit_width ( db, BIT_WIDTH ) ;
115+ for i in 0 ..ITEM_COUNT {
116+ a. set ( vec ! [ i; 20 ] . into ( ) , BenchData :: new ( i) ) . unwrap ( ) ;
117+ }
118+ a
119+ }
120+
121+ criterion_group ! (
122+ benches,
123+ insert,
124+ insert_load_flush,
125+ delete,
126+ for_each,
127+ for_each_cacheless
128+ ) ;
103129criterion_main ! ( benches) ;
0 commit comments