@@ -25,11 +25,25 @@ pub struct InternedInput<'db> {
25
25
pub text : String ,
26
26
}
27
27
28
+ #[ derive( Debug , Clone , Copy , PartialEq , Eq , Hash , salsa:: Supertype ) ]
29
+ enum SupertypeInput < ' db > {
30
+ InternedInput ( InternedInput < ' db > ) ,
31
+ Input ( Input ) ,
32
+ }
33
+
28
34
#[ salsa:: tracked]
29
35
pub fn interned_length < ' db > ( db : & ' db dyn salsa:: Database , input : InternedInput < ' db > ) -> usize {
30
36
input. text ( db) . len ( )
31
37
}
32
38
39
+ #[ salsa:: tracked]
40
+ pub fn either_length < ' db > ( db : & ' db dyn salsa:: Database , input : SupertypeInput < ' db > ) -> usize {
41
+ match input {
42
+ SupertypeInput :: InternedInput ( input) => interned_length ( db, input) ,
43
+ SupertypeInput :: Input ( input) => length ( db, input) ,
44
+ }
45
+ }
46
+
33
47
fn mutating_inputs ( c : & mut Criterion ) {
34
48
let mut group: codspeed_criterion_compat:: BenchmarkGroup <
35
49
codspeed_criterion_compat:: measurement:: WallTime ,
@@ -150,6 +164,77 @@ fn inputs(c: &mut Criterion) {
150
164
)
151
165
} ) ;
152
166
167
+ group. bench_function ( BenchmarkId :: new ( "new" , "SupertypeInput" ) , |b| {
168
+ b. iter_batched_ref (
169
+ || {
170
+ let db = salsa:: DatabaseImpl :: default ( ) ;
171
+
172
+ // Prepopulate ingredients.
173
+ let input = SupertypeInput :: Input ( Input :: new (
174
+ black_box ( & db) ,
175
+ black_box ( "hello, world!" . to_owned ( ) ) ,
176
+ ) ) ;
177
+ let interned_input = SupertypeInput :: InternedInput ( InternedInput :: new (
178
+ black_box ( & db) ,
179
+ black_box ( "hello, world!" . to_owned ( ) ) ,
180
+ ) ) ;
181
+ let len = either_length ( black_box ( & db) , black_box ( input) ) ;
182
+ assert_eq ! ( black_box( len) , 13 ) ;
183
+ let len = either_length ( black_box ( & db) , black_box ( interned_input) ) ;
184
+ assert_eq ! ( black_box( len) , 13 ) ;
185
+
186
+ db
187
+ } ,
188
+ |db| {
189
+ let input = SupertypeInput :: Input ( Input :: new (
190
+ black_box ( db) ,
191
+ black_box ( "hello, world!" . to_owned ( ) ) ,
192
+ ) ) ;
193
+ let interned_input = SupertypeInput :: InternedInput ( InternedInput :: new (
194
+ black_box ( db) ,
195
+ black_box ( "hello, world!" . to_owned ( ) ) ,
196
+ ) ) ;
197
+ let len = either_length ( black_box ( db) , black_box ( input) ) ;
198
+ assert_eq ! ( black_box( len) , 13 ) ;
199
+ let len = either_length ( black_box ( db) , black_box ( interned_input) ) ;
200
+ assert_eq ! ( black_box( len) , 13 ) ;
201
+ } ,
202
+ BatchSize :: SmallInput ,
203
+ )
204
+ } ) ;
205
+
206
+ group. bench_function ( BenchmarkId :: new ( "amortized" , "SupertypeInput" ) , |b| {
207
+ b. iter_batched_ref (
208
+ || {
209
+ let db = salsa:: DatabaseImpl :: default ( ) ;
210
+
211
+ let input = SupertypeInput :: Input ( Input :: new (
212
+ black_box ( & db) ,
213
+ black_box ( "hello, world!" . to_owned ( ) ) ,
214
+ ) ) ;
215
+ let interned_input = SupertypeInput :: InternedInput ( InternedInput :: new (
216
+ black_box ( & db) ,
217
+ black_box ( "hello, world!" . to_owned ( ) ) ,
218
+ ) ) ;
219
+ // we can't pass this along otherwise, and the lifetime is generally informational
220
+ let interned_input: SupertypeInput < ' static > = unsafe { transmute ( interned_input) } ;
221
+ let len = either_length ( black_box ( & db) , black_box ( input) ) ;
222
+ assert_eq ! ( black_box( len) , 13 ) ;
223
+ let len = either_length ( black_box ( & db) , black_box ( interned_input) ) ;
224
+ assert_eq ! ( black_box( len) , 13 ) ;
225
+
226
+ ( db, input, interned_input)
227
+ } ,
228
+ |& mut ( ref db, input, interned_input) | {
229
+ let len = either_length ( black_box ( db) , black_box ( input) ) ;
230
+ assert_eq ! ( black_box( len) , 13 ) ;
231
+ let len = either_length ( black_box ( db) , black_box ( interned_input) ) ;
232
+ assert_eq ! ( black_box( len) , 13 ) ;
233
+ } ,
234
+ BatchSize :: SmallInput ,
235
+ )
236
+ } ) ;
237
+
153
238
group. finish ( ) ;
154
239
}
155
240
0 commit comments