@@ -323,6 +323,24 @@ fn ensure_valid_return_type(item_fn: &ItemFn) -> Result<()> {
323
323
Ok ( ( ) )
324
324
}
325
325
326
+ /// Ensure that the passed statements do not contain any forbidden variable names
327
+ fn ensure_no_forbidden_variable_names ( stmts : & [ Stmt ] ) -> Result < ( ) > {
328
+ const FORBIDDEN_VAR_NAMES : [ & str ; 2 ] = [ "recording" , "verify" ] ;
329
+ for stmt in stmts {
330
+ let Stmt :: Local ( l) = stmt else { continue } ;
331
+ let Pat :: Ident ( ident) = & l. pat else { continue } ;
332
+ if FORBIDDEN_VAR_NAMES . contains ( & ident. ident . to_string ( ) . as_str ( ) ) {
333
+ return Err ( Error :: new (
334
+ ident. span ( ) ,
335
+ format ! (
336
+ "Variables {FORBIDDEN_VAR_NAMES:?} are reserved for benchmarking internals." ,
337
+ ) ,
338
+ ) ) ;
339
+ }
340
+ }
341
+ Ok ( ( ) )
342
+ }
343
+
326
344
/// Parses params such as `x: Linear<0, 1>`
327
345
fn parse_params ( item_fn : & ItemFn ) -> Result < Vec < ParamDef > > {
328
346
let mut params: Vec < ParamDef > = Vec :: new ( ) ;
@@ -481,9 +499,12 @@ impl BenchmarkDef {
481
499
}
482
500
} ;
483
501
502
+ let setup_stmts = Vec :: from ( & item_fn. block . stmts [ 0 ..i] ) ;
503
+ ensure_no_forbidden_variable_names ( & setup_stmts) ?;
504
+
484
505
Ok ( BenchmarkDef {
485
506
params,
486
- setup_stmts : Vec :: from ( & item_fn . block . stmts [ 0 ..i ] ) ,
507
+ setup_stmts,
487
508
call_def,
488
509
verify_stmts,
489
510
last_stmt,
@@ -692,18 +713,16 @@ pub fn benchmarks(
692
713
693
714
fn instance(
694
715
& self ,
716
+ recording: & mut impl #krate:: Recording ,
695
717
components: & [ ( #krate:: BenchmarkParameter , u32 ) ] ,
696
718
verify: bool ,
697
- ) -> Result <
698
- #krate:: __private:: Box <dyn FnOnce ( ) -> Result <( ) , #krate:: BenchmarkError >>,
699
- #krate:: BenchmarkError ,
700
- > {
719
+ ) -> Result <( ) , #krate:: BenchmarkError > {
701
720
match self {
702
721
#(
703
722
Self :: #benchmark_names => {
704
723
<#benchmark_names as #krate:: BenchmarkingSetup <
705
724
#type_use_generics
706
- >>:: instance( & #benchmark_names, components, verify)
725
+ >>:: instance( & #benchmark_names, recording , components, verify)
707
726
}
708
727
)
709
728
*
@@ -794,17 +813,7 @@ pub fn benchmarks(
794
813
#krate:: benchmarking:: set_whitelist( whitelist. clone( ) ) ;
795
814
let mut results: #krate:: __private:: Vec <#krate:: BenchmarkResult > = #krate:: __private:: Vec :: new( ) ;
796
815
797
- // Always do at least one internal repeat...
798
- for _ in 0 .. internal_repeats. max( 1 ) {
799
- // Always reset the state after the benchmark.
800
- #krate:: __private:: defer!( #krate:: benchmarking:: wipe_db( ) ) ;
801
-
802
- // Set up the externalities environment for the setup we want to
803
- // benchmark.
804
- let closure_to_benchmark = <
805
- SelectedBenchmark as #krate:: BenchmarkingSetup <#type_use_generics>
806
- >:: instance( & selected_benchmark, c, verify) ?;
807
-
816
+ let on_before_start = || {
808
817
// Set the block number to at least 1 so events are deposited.
809
818
if #krate:: __private:: Zero :: is_zero( & #frame_system:: Pallet :: <T >:: block_number( ) ) {
810
819
#frame_system:: Pallet :: <T >:: set_block_number( 1u32 . into( ) ) ;
@@ -822,6 +831,12 @@ pub fn benchmarks(
822
831
823
832
// Reset the read/write counter so we don't count operations in the setup process.
824
833
#krate:: benchmarking:: reset_read_write_count( ) ;
834
+ } ;
835
+
836
+ // Always do at least one internal repeat...
837
+ for _ in 0 .. internal_repeats. max( 1 ) {
838
+ // Always reset the state after the benchmark.
839
+ #krate:: __private:: defer!( #krate:: benchmarking:: wipe_db( ) ) ;
825
840
826
841
// Time the extrinsic logic.
827
842
#krate:: __private:: log:: trace!(
@@ -831,20 +846,12 @@ pub fn benchmarks(
831
846
c
832
847
) ;
833
848
834
- let start_pov = #krate:: benchmarking:: proof_size( ) ;
835
- let start_extrinsic = #krate:: benchmarking:: current_time( ) ;
836
-
837
- closure_to_benchmark( ) ?;
838
-
839
- let finish_extrinsic = #krate:: benchmarking:: current_time( ) ;
840
- let end_pov = #krate:: benchmarking:: proof_size( ) ;
849
+ let mut recording = #krate:: BenchmarkRecording :: new( & on_before_start) ;
850
+ <SelectedBenchmark as #krate:: BenchmarkingSetup <#type_use_generics>>:: instance( & selected_benchmark, & mut recording, c, verify) ?;
841
851
842
852
// Calculate the diff caused by the benchmark.
843
- let elapsed_extrinsic = finish_extrinsic. saturating_sub( start_extrinsic) ;
844
- let diff_pov = match ( start_pov, end_pov) {
845
- ( Some ( start) , Some ( end) ) => end. saturating_sub( start) ,
846
- _ => Default :: default ( ) ,
847
- } ;
853
+ let elapsed_extrinsic = recording. elapsed_extrinsic( ) . expect( "elapsed time should be recorded" ) ;
854
+ let diff_pov = recording. diff_pov( ) . unwrap_or_default( ) ;
848
855
849
856
// Commit the changes to get proper write count
850
857
#krate:: benchmarking:: commit_db( ) ;
@@ -1163,9 +1170,10 @@ fn expand_benchmark(
1163
1170
1164
1171
fn instance(
1165
1172
& self ,
1173
+ recording: & mut impl #krate:: Recording ,
1166
1174
components: & [ ( #krate:: BenchmarkParameter , u32 ) ] ,
1167
1175
verify: bool
1168
- ) -> Result <#krate :: __private :: Box <dyn FnOnce ( ) -> Result < ( ) , #krate :: BenchmarkError >> , #krate:: BenchmarkError > {
1176
+ ) -> Result <( ) , #krate:: BenchmarkError > {
1169
1177
#(
1170
1178
// prepare instance #param_names
1171
1179
let #param_names = components. iter( )
@@ -1179,15 +1187,15 @@ fn expand_benchmark(
1179
1187
#setup_stmts
1180
1188
) *
1181
1189
#pre_call
1182
- Ok ( #krate :: __private :: Box :: new ( move || -> Result < ( ) , #krate :: BenchmarkError > {
1183
- #post_call
1184
- if verify {
1185
- # (
1186
- #verify_stmts
1187
- ) *
1188
- }
1189
- #impl_last_stmt
1190
- } ) )
1190
+ recording . start ( ) ;
1191
+ #post_call
1192
+ recording . stop ( ) ;
1193
+ if verify {
1194
+ # (
1195
+ #verify_stmts
1196
+ ) *
1197
+ }
1198
+ #impl_last_stmt
1191
1199
}
1192
1200
}
1193
1201
@@ -1205,18 +1213,15 @@ fn expand_benchmark(
1205
1213
// Always reset the state after the benchmark.
1206
1214
#krate:: __private:: defer!( #krate:: benchmarking:: wipe_db( ) ) ;
1207
1215
1208
- // Set up the benchmark, return execution + verification function.
1209
- let closure_to_verify = <
1210
- SelectedBenchmark as #krate:: BenchmarkingSetup <T , _>
1211
- >:: instance( & selected_benchmark, & c, true ) ?;
1212
-
1213
- // Set the block number to at least 1 so events are deposited.
1214
- if #krate:: __private:: Zero :: is_zero( & #frame_system:: Pallet :: <T >:: block_number( ) ) {
1215
- #frame_system:: Pallet :: <T >:: set_block_number( 1u32 . into( ) ) ;
1216
- }
1216
+ let on_before_start = || {
1217
+ // Set the block number to at least 1 so events are deposited.
1218
+ if #krate:: __private:: Zero :: is_zero( & #frame_system:: Pallet :: <T >:: block_number( ) ) {
1219
+ #frame_system:: Pallet :: <T >:: set_block_number( 1u32 . into( ) ) ;
1220
+ }
1221
+ } ;
1217
1222
1218
1223
// Run execution + verification
1219
- closure_to_verify ( )
1224
+ < SelectedBenchmark as #krate :: BenchmarkingSetup < T , _>> :: test_instance ( & selected_benchmark , & c , & on_before_start )
1220
1225
} ;
1221
1226
1222
1227
if components. is_empty( ) {
0 commit comments