12
12
// See the License for the specific language governing permissions and
13
13
// limitations under the License.
14
14
15
+ #![ feature( once_cell) ]
16
+ use std:: sync:: LazyLock ;
17
+
15
18
use bytes:: { BufMut , Bytes , BytesMut } ;
16
19
use criterion:: { criterion_group, criterion_main, BenchmarkId , Criterion } ;
17
20
use risingwave_hummock_sdk:: key:: FullKey ;
@@ -23,6 +26,7 @@ const TABLES_PER_SSTABLE: u32 = 10;
23
26
const KEYS_PER_TABLE : u64 = 100 ;
24
27
const RESTART_INTERVAL : usize = 16 ;
25
28
const BLOCK_CAPACITY : usize = TABLES_PER_SSTABLE as usize * KEYS_PER_TABLE as usize * 64 ;
29
+ const EXCHANGE_INTERVAL : usize = RESTART_INTERVAL / 2 ;
26
30
27
31
fn block_iter_next ( block : BlockHolder ) {
28
32
let mut iter = BlockIterator :: new ( block) ;
@@ -86,11 +90,22 @@ fn bench_block_iter(c: &mut Criterion) {
86
90
let l = data. len ( ) ;
87
91
let block = BlockHolder :: from_owned_block ( Box :: new ( Block :: decode ( data, l) . unwrap ( ) ) ) ;
88
92
let mut iter = BlockIterator :: new ( block) ;
93
+ let mut item_count = 0 ;
94
+ let mut ext_index = 0 ;
95
+ let ( mut k_ext, mut v_ext) = ( & DATA_LEN_SET [ ext_index] . 0 , & DATA_LEN_SET [ ext_index] . 1 ) ;
96
+
89
97
iter. seek_to_first ( ) ;
90
98
for t in 1 ..=TABLES_PER_SSTABLE {
91
99
for i in 1 ..=KEYS_PER_TABLE {
92
- assert_eq ! ( iter. key( ) , FullKey :: decode( & key( t, i) ) ) ;
93
- assert_eq ! ( iter. value( ) , value( i) . to_vec( ) ) ;
100
+ item_count += 1 ;
101
+
102
+ if item_count % EXCHANGE_INTERVAL == 0 {
103
+ ext_index = ( ext_index + 1 ) % DATA_LEN_SET . len ( ) ;
104
+ ( k_ext, v_ext) = ( & DATA_LEN_SET [ ext_index] . 0 , & DATA_LEN_SET [ ext_index] . 1 ) ;
105
+ }
106
+
107
+ assert_eq ! ( iter. key( ) , FullKey :: decode( & key( t, i, k_ext) ) ) ;
108
+ assert_eq ! ( iter. value( ) , value( i, v_ext) . to_vec( ) ) ;
94
109
iter. next ( ) ;
95
110
}
96
111
}
@@ -100,30 +115,57 @@ fn bench_block_iter(c: &mut Criterion) {
100
115
criterion_group ! ( benches, bench_block_iter) ;
101
116
criterion_main ! ( benches) ;
102
117
118
+ static DATA_LEN_SET : LazyLock < Vec < ( Vec < u8 > , Vec < u8 > ) > > = LazyLock :: new ( || {
119
+ vec ! [
120
+ ( vec![ b'a' ; 10 ] , vec![ b'a' ; 10 ] ) , // U8U8
121
+ ( vec![ b'a' ; 10 ] , vec![ b'a' ; 300 ] ) , // U8U16
122
+ ( vec![ b'a' ; 100 ] , vec![ b'a' ; 65550 ] ) , // U8U32
123
+ ( vec![ b'a' ; 300 ] , vec![ b'a' ; 100 ] ) , // U16U8
124
+ ( vec![ b'a' ; 300 ] , vec![ b'a' ; 300 ] ) , // U16U16
125
+ ( vec![ b'a' ; 300 ] , vec![ b'a' ; 65550 ] ) , // U16U32
126
+ ( vec![ b'a' ; 65550 ] , vec![ b'a' ; 100 ] ) , // U32U8
127
+ ( vec![ b'a' ; 65550 ] , vec![ b'a' ; 300 ] ) , // U32U16
128
+ ( vec![ b'a' ; 65550 ] , vec![ b'a' ; 65550 ] ) , // U32U32
129
+ ]
130
+ } ) ;
131
+
103
132
fn build_block_data ( t : u32 , i : u64 ) -> Bytes {
104
133
let options = BlockBuilderOptions {
105
134
capacity : BLOCK_CAPACITY ,
106
135
compression_algorithm : CompressionAlgorithm :: None ,
107
136
restart_interval : RESTART_INTERVAL ,
108
137
} ;
109
138
let mut builder = BlockBuilder :: new ( options) ;
139
+ let mut item_count = 0 ;
140
+ let mut ext_index = 0 ;
141
+ let ( mut k_ext, mut v_ext) = ( & DATA_LEN_SET [ ext_index] . 0 , & DATA_LEN_SET [ ext_index] . 1 ) ;
142
+
110
143
for tt in 1 ..=t {
111
144
for ii in 1 ..=i {
112
- builder. add ( FullKey :: decode ( & key ( tt, ii) ) , & value ( ii) ) ;
145
+ item_count += 1 ;
146
+
147
+ if item_count % EXCHANGE_INTERVAL == 0 {
148
+ ext_index = ( ext_index + 1 ) % DATA_LEN_SET . len ( ) ;
149
+ ( k_ext, v_ext) = ( & DATA_LEN_SET [ ext_index] . 0 , & DATA_LEN_SET [ ext_index] . 1 ) ;
150
+ }
151
+
152
+ builder. add ( FullKey :: decode ( & key ( tt, ii, k_ext) ) , & value ( ii, v_ext) ) ;
113
153
}
114
154
}
115
155
Bytes :: from ( builder. build ( ) . to_vec ( ) )
116
156
}
117
157
118
- fn key ( t : u32 , i : u64 ) -> Bytes {
158
+ fn key ( t : u32 , i : u64 , ext : & [ u8 ] ) -> Bytes {
119
159
let mut buf = BytesMut :: new ( ) ;
160
+ buf. put_slice ( ext) ;
120
161
buf. put_u32 ( t) ;
121
162
buf. put_u64 ( i) ;
122
163
buf. freeze ( )
123
164
}
124
165
125
- fn value ( i : u64 ) -> Bytes {
166
+ fn value ( i : u64 , ext : & [ u8 ] ) -> Bytes {
126
167
let mut buf = BytesMut :: new ( ) ;
127
168
buf. put_u64 ( i) ;
169
+ buf. put ( ext) ;
128
170
buf. freeze ( )
129
171
}
0 commit comments