mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-13 05:51:02 +00:00
Update benchmarking macros (#3934)
Current benchmarking macro returns a closure with the captured
benchmarked code.
This can cause issues when the benchmarked code has complex lifetime
requirements.
This PR updates the existing macro by injecting the recording parameter
and invoking the start / stop method around the benchmarked block
instead of returning a closure
One other added benefit is that you can write this kind of code now as
well:
```rust
let v;
#[block]
{ v = func.call(); }
dbg!(v); // or assert something on v
```
[Weights compare
link](https://weights.tasty.limo/compare?unit=weight&ignore_errors=true&threshold=10&method=asymptotic&repo=polkadot-sdk&old=pg/fix-weights&new=pg/bench_update&path_pattern=substrate/frame/**/src/weights.rs,polkadot/runtime/*/src/weights/**/*.rs,polkadot/bridges/modules/*/src/weights.rs,cumulus/**/weights/*.rs,cumulus/**/weights/xcm/*.rs,cumulus/**/src/weights.rs)
---------
Co-authored-by: command-bot <>
Co-authored-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io>
Co-authored-by: Alexander Theißen <alex.theissen@me.com>
This commit is contained in:
@@ -262,15 +262,11 @@ mod benchmarks {
|
||||
let components = <SelectedBenchmark as BenchmarkingSetup<Test>>::components(&selected);
|
||||
assert_eq!(components, vec![(BenchmarkParameter::b, 1, 1000)]);
|
||||
|
||||
let closure = <SelectedBenchmark as BenchmarkingSetup<Test>>::instance(
|
||||
&selected,
|
||||
&[(BenchmarkParameter::b, 1)],
|
||||
true,
|
||||
)
|
||||
.expect("failed to create closure");
|
||||
|
||||
new_test_ext().execute_with(|| {
|
||||
assert_ok!(closure());
|
||||
assert_ok!(<SelectedBenchmark as BenchmarkingSetup<Test>>::unit_test_instance(
|
||||
&selected,
|
||||
&[(BenchmarkParameter::b, 1)],
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -281,15 +277,11 @@ mod benchmarks {
|
||||
let components = <SelectedBenchmark as BenchmarkingSetup<Test>>::components(&selected);
|
||||
assert_eq!(components, vec![(BenchmarkParameter::b, 1, 1000)]);
|
||||
|
||||
let closure = <SelectedBenchmark as BenchmarkingSetup<Test>>::instance(
|
||||
&selected,
|
||||
&[(BenchmarkParameter::b, 1)],
|
||||
true,
|
||||
)
|
||||
.expect("failed to create closure");
|
||||
|
||||
new_test_ext().execute_with(|| {
|
||||
assert_ok!(closure());
|
||||
assert_ok!(<SelectedBenchmark as BenchmarkingSetup<Test>>::unit_test_instance(
|
||||
&selected,
|
||||
&[(BenchmarkParameter::b, 1)],
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -300,14 +292,12 @@ mod benchmarks {
|
||||
let components = <SelectedBenchmark as BenchmarkingSetup<Test>>::components(&selected);
|
||||
assert_eq!(components, vec![(BenchmarkParameter::x, 1, 10000)]);
|
||||
|
||||
let closure = <SelectedBenchmark as BenchmarkingSetup<Test>>::instance(
|
||||
&selected,
|
||||
&[(BenchmarkParameter::x, 1)],
|
||||
true,
|
||||
)
|
||||
.expect("failed to create closure");
|
||||
|
||||
assert_ok!(closure());
|
||||
new_test_ext().execute_with(|| {
|
||||
assert_ok!(<SelectedBenchmark as BenchmarkingSetup<Test>>::unit_test_instance(
|
||||
&selected,
|
||||
&[(BenchmarkParameter::x, 1)],
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -315,29 +305,24 @@ mod benchmarks {
|
||||
// Check postcondition for benchmark `set_value` is valid.
|
||||
let selected = SelectedBenchmark::set_value;
|
||||
|
||||
let closure = <SelectedBenchmark as BenchmarkingSetup<Test>>::instance(
|
||||
&selected,
|
||||
&[(BenchmarkParameter::b, 1)],
|
||||
true,
|
||||
)
|
||||
.expect("failed to create closure");
|
||||
|
||||
new_test_ext().execute_with(|| {
|
||||
assert_ok!(closure());
|
||||
assert_ok!(<SelectedBenchmark as BenchmarkingSetup<Test>>::unit_test_instance(
|
||||
&selected,
|
||||
&[(BenchmarkParameter::b, 1)],
|
||||
));
|
||||
});
|
||||
|
||||
// Check postcondition for benchmark `bad_verify` is invalid.
|
||||
let selected = SelectedBenchmark::bad_verify;
|
||||
|
||||
let closure = <SelectedBenchmark as BenchmarkingSetup<Test>>::instance(
|
||||
&selected,
|
||||
&[(BenchmarkParameter::x, 10000)],
|
||||
true,
|
||||
)
|
||||
.expect("failed to create closure");
|
||||
|
||||
new_test_ext().execute_with(|| {
|
||||
assert_err!(closure(), "You forgot to sort!");
|
||||
assert_err!(
|
||||
<SelectedBenchmark as BenchmarkingSetup<Test>>::unit_test_instance(
|
||||
&selected,
|
||||
&[(BenchmarkParameter::x, 10000)],
|
||||
),
|
||||
"You forgot to sort!"
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -345,15 +330,11 @@ mod benchmarks {
|
||||
fn benchmark_override_works() {
|
||||
let selected = SelectedBenchmark::override_benchmark;
|
||||
|
||||
let closure = <SelectedBenchmark as BenchmarkingSetup<Test>>::instance(
|
||||
&selected,
|
||||
&[(BenchmarkParameter::b, 1)],
|
||||
true,
|
||||
)
|
||||
.expect("failed to create closure");
|
||||
|
||||
new_test_ext().execute_with(|| {
|
||||
let result = closure();
|
||||
let result = <SelectedBenchmark as BenchmarkingSetup<Test>>::unit_test_instance(
|
||||
&selected,
|
||||
&[(BenchmarkParameter::b, 1)],
|
||||
);
|
||||
assert!(matches!(result, Err(BenchmarkError::Override(_))));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ use scale_info::TypeInfo;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use sp_io::hashing::blake2_256;
|
||||
use sp_runtime::{traits::TrailingZeroInput, DispatchError};
|
||||
use sp_std::{prelude::Box, vec::Vec};
|
||||
use sp_std::vec::Vec;
|
||||
use sp_storage::TrackedStorageKey;
|
||||
|
||||
/// An alphabet of possible parameters to use for benchmarking.
|
||||
@@ -342,6 +342,90 @@ pub trait Benchmarking {
|
||||
) -> Result<Vec<BenchmarkResult>, BenchmarkError>;
|
||||
}
|
||||
|
||||
/// The recording trait used to mark the start and end of a benchmark.
|
||||
pub trait Recording {
|
||||
/// Start the benchmark.
|
||||
fn start(&mut self) {}
|
||||
|
||||
// Stop the benchmark.
|
||||
fn stop(&mut self) {}
|
||||
}
|
||||
|
||||
/// A no-op recording, used for unit test.
|
||||
struct NoopRecording;
|
||||
impl Recording for NoopRecording {}
|
||||
|
||||
/// A no-op recording, used for tests that should setup some state before running the benchmark.
|
||||
struct TestRecording<'a> {
|
||||
on_before_start: Option<&'a dyn Fn()>,
|
||||
}
|
||||
|
||||
impl<'a> TestRecording<'a> {
|
||||
fn new(on_before_start: &'a dyn Fn()) -> Self {
|
||||
Self { on_before_start: Some(on_before_start) }
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Recording for TestRecording<'a> {
|
||||
fn start(&mut self) {
|
||||
(self.on_before_start.take().expect("start called more than once"))();
|
||||
}
|
||||
}
|
||||
|
||||
/// Records the time and proof size of a single benchmark iteration.
|
||||
pub struct BenchmarkRecording<'a> {
|
||||
on_before_start: Option<&'a dyn Fn()>,
|
||||
start_extrinsic: Option<u128>,
|
||||
finish_extrinsic: Option<u128>,
|
||||
start_pov: Option<u32>,
|
||||
end_pov: Option<u32>,
|
||||
}
|
||||
|
||||
impl<'a> BenchmarkRecording<'a> {
|
||||
pub fn new(on_before_start: &'a dyn Fn()) -> Self {
|
||||
Self {
|
||||
on_before_start: Some(on_before_start),
|
||||
start_extrinsic: None,
|
||||
finish_extrinsic: None,
|
||||
start_pov: None,
|
||||
end_pov: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Recording for BenchmarkRecording<'a> {
|
||||
fn start(&mut self) {
|
||||
(self.on_before_start.take().expect("start called more than once"))();
|
||||
self.start_pov = crate::benchmarking::proof_size();
|
||||
self.start_extrinsic = Some(crate::benchmarking::current_time());
|
||||
}
|
||||
|
||||
fn stop(&mut self) {
|
||||
self.finish_extrinsic = Some(crate::benchmarking::current_time());
|
||||
self.end_pov = crate::benchmarking::proof_size();
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> BenchmarkRecording<'a> {
|
||||
pub fn start_pov(&self) -> Option<u32> {
|
||||
self.start_pov
|
||||
}
|
||||
|
||||
pub fn end_pov(&self) -> Option<u32> {
|
||||
self.end_pov
|
||||
}
|
||||
|
||||
pub fn diff_pov(&self) -> Option<u32> {
|
||||
self.start_pov.zip(self.end_pov).map(|(start, end)| end.saturating_sub(start))
|
||||
}
|
||||
|
||||
pub fn elapsed_extrinsic(&self) -> Option<u128> {
|
||||
self.start_extrinsic
|
||||
.zip(self.finish_extrinsic)
|
||||
.map(|(start, end)| end.saturating_sub(start))
|
||||
}
|
||||
}
|
||||
|
||||
/// The required setup for creating a benchmark.
|
||||
///
|
||||
/// Instance generic parameter is optional and can be used in order to capture unused generics for
|
||||
@@ -353,9 +437,27 @@ pub trait BenchmarkingSetup<T, I = ()> {
|
||||
/// Set up the storage, and prepare a closure to run the benchmark.
|
||||
fn instance(
|
||||
&self,
|
||||
recording: &mut impl Recording,
|
||||
components: &[(BenchmarkParameter, u32)],
|
||||
verify: bool,
|
||||
) -> Result<Box<dyn FnOnce() -> Result<(), BenchmarkError>>, BenchmarkError>;
|
||||
) -> Result<(), BenchmarkError>;
|
||||
|
||||
/// Same as `instance` but passing a closure to run before the benchmark starts.
|
||||
fn test_instance(
|
||||
&self,
|
||||
components: &[(BenchmarkParameter, u32)],
|
||||
on_before_start: &dyn Fn(),
|
||||
) -> Result<(), BenchmarkError> {
|
||||
return self.instance(&mut TestRecording::new(on_before_start), components, true);
|
||||
}
|
||||
|
||||
/// Same as `instance` but passing a no-op recording for unit tests.
|
||||
fn unit_test_instance(
|
||||
&self,
|
||||
components: &[(BenchmarkParameter, u32)],
|
||||
) -> Result<(), BenchmarkError> {
|
||||
return self.instance(&mut NoopRecording {}, components, true);
|
||||
}
|
||||
}
|
||||
|
||||
/// Grab an account, seeded by a name and index.
|
||||
|
||||
@@ -786,9 +786,10 @@ macro_rules! benchmark_backend {
|
||||
|
||||
fn instance(
|
||||
&self,
|
||||
recording: &mut impl $crate::Recording,
|
||||
components: &[($crate::BenchmarkParameter, u32)],
|
||||
verify: bool
|
||||
) -> Result<$crate::__private::Box<dyn FnOnce() -> Result<(), $crate::BenchmarkError>>, $crate::BenchmarkError> {
|
||||
) -> Result<(), $crate::BenchmarkError> {
|
||||
$(
|
||||
// Prepare instance
|
||||
let $param = components.iter()
|
||||
@@ -802,13 +803,14 @@ macro_rules! benchmark_backend {
|
||||
$( $param_instancer ; )*
|
||||
$( $post )*
|
||||
|
||||
Ok($crate::__private::Box::new(move || -> Result<(), $crate::BenchmarkError> {
|
||||
$eval;
|
||||
if verify {
|
||||
$postcode;
|
||||
}
|
||||
Ok(())
|
||||
}))
|
||||
recording.start();
|
||||
$eval;
|
||||
recording.stop();
|
||||
|
||||
if verify {
|
||||
$postcode;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -960,14 +962,15 @@ macro_rules! selected_benchmark {
|
||||
|
||||
fn instance(
|
||||
&self,
|
||||
recording: &mut impl $crate::Recording,
|
||||
components: &[($crate::BenchmarkParameter, u32)],
|
||||
verify: bool
|
||||
) -> Result<$crate::__private::Box<dyn FnOnce() -> Result<(), $crate::BenchmarkError>>, $crate::BenchmarkError> {
|
||||
) -> Result<(), $crate::BenchmarkError> {
|
||||
match self {
|
||||
$(
|
||||
Self::$bench => <
|
||||
$bench as $crate::BenchmarkingSetup<T $(, $bench_inst)? >
|
||||
>::instance(&$bench, components, verify),
|
||||
>::instance(&$bench, recording, components, verify),
|
||||
)*
|
||||
}
|
||||
}
|
||||
@@ -1069,18 +1072,7 @@ macro_rules! impl_benchmark {
|
||||
$crate::benchmarking::set_whitelist(whitelist.clone());
|
||||
|
||||
let mut results: $crate::__private::Vec<$crate::BenchmarkResult> = $crate::__private::Vec::new();
|
||||
|
||||
// Always do at least one internal repeat...
|
||||
for _ in 0 .. internal_repeats.max(1) {
|
||||
// Always reset the state after the benchmark.
|
||||
$crate::__private::defer!($crate::benchmarking::wipe_db());
|
||||
|
||||
// Set up the externalities environment for the setup we want to
|
||||
// benchmark.
|
||||
let closure_to_benchmark = <
|
||||
SelectedBenchmark as $crate::BenchmarkingSetup<T $(, $instance)?>
|
||||
>::instance(&selected_benchmark, c, verify)?;
|
||||
|
||||
let on_before_start = || {
|
||||
// Set the block number to at least 1 so events are deposited.
|
||||
if $crate::__private::Zero::is_zero(&frame_system::Pallet::<T>::block_number()) {
|
||||
frame_system::Pallet::<T>::set_block_number(1u32.into());
|
||||
@@ -1098,6 +1090,12 @@ macro_rules! impl_benchmark {
|
||||
|
||||
// Reset the read/write counter so we don't count operations in the setup process.
|
||||
$crate::benchmarking::reset_read_write_count();
|
||||
};
|
||||
|
||||
// Always do at least one internal repeat...
|
||||
for _ in 0 .. internal_repeats.max(1) {
|
||||
// Always reset the state after the benchmark.
|
||||
$crate::__private::defer!($crate::benchmarking::wipe_db());
|
||||
|
||||
// Time the extrinsic logic.
|
||||
$crate::__private::log::trace!(
|
||||
@@ -1108,20 +1106,14 @@ macro_rules! impl_benchmark {
|
||||
verify
|
||||
);
|
||||
|
||||
let start_pov = $crate::benchmarking::proof_size();
|
||||
let start_extrinsic = $crate::benchmarking::current_time();
|
||||
|
||||
closure_to_benchmark()?;
|
||||
|
||||
let finish_extrinsic = $crate::benchmarking::current_time();
|
||||
let end_pov = $crate::benchmarking::proof_size();
|
||||
// Set up the externalities environment for the setup we want to
|
||||
// benchmark.
|
||||
let mut recording = $crate::BenchmarkRecording::new(&on_before_start);
|
||||
<SelectedBenchmark as $crate::BenchmarkingSetup<T $(, $instance)?>>::instance(&selected_benchmark, &mut recording, c, verify)?;
|
||||
|
||||
// Calculate the diff caused by the benchmark.
|
||||
let elapsed_extrinsic = finish_extrinsic.saturating_sub(start_extrinsic);
|
||||
let diff_pov = match (start_pov, end_pov) {
|
||||
(Some(start), Some(end)) => end.saturating_sub(start),
|
||||
_ => Default::default(),
|
||||
};
|
||||
let elapsed_extrinsic = recording.elapsed_extrinsic().expect("elapsed time should be recorded");
|
||||
let diff_pov = recording.diff_pov().unwrap_or_default();
|
||||
|
||||
// Commit the changes to get proper write count
|
||||
$crate::benchmarking::commit_db();
|
||||
@@ -1136,7 +1128,7 @@ macro_rules! impl_benchmark {
|
||||
);
|
||||
$crate::__private::log::trace!(
|
||||
target: "benchmark",
|
||||
"Proof sizes: before {:?} after {:?} diff {}", &start_pov, &end_pov, &diff_pov
|
||||
"Proof sizes: before {:?} after {:?} diff {}", recording.start_pov(), recording.end_pov(), &diff_pov
|
||||
);
|
||||
|
||||
// Time the storage root recalculation.
|
||||
@@ -1230,18 +1222,15 @@ macro_rules! impl_benchmark_test {
|
||||
// Always reset the state after the benchmark.
|
||||
$crate::__private::defer!($crate::benchmarking::wipe_db());
|
||||
|
||||
// Set up the benchmark, return execution + verification function.
|
||||
let closure_to_verify = <
|
||||
SelectedBenchmark as $crate::BenchmarkingSetup<T, _>
|
||||
>::instance(&selected_benchmark, &c, true)?;
|
||||
|
||||
// Set the block number to at least 1 so events are deposited.
|
||||
if $crate::__private::Zero::is_zero(&frame_system::Pallet::<T>::block_number()) {
|
||||
frame_system::Pallet::<T>::set_block_number(1u32.into());
|
||||
}
|
||||
let on_before_start = || {
|
||||
// Set the block number to at least 1 so events are deposited.
|
||||
if $crate::__private::Zero::is_zero(&frame_system::Pallet::<T>::block_number()) {
|
||||
frame_system::Pallet::<T>::set_block_number(1u32.into());
|
||||
}
|
||||
};
|
||||
|
||||
// Run execution + verification
|
||||
closure_to_verify()
|
||||
<SelectedBenchmark as $crate::BenchmarkingSetup<T, _>>::test_instance(&selected_benchmark, &c, &on_before_start)
|
||||
};
|
||||
|
||||
if components.is_empty() {
|
||||
|
||||
+40
-41
@@ -15,16 +15,16 @@
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
//! Autogenerated weights for frame_benchmarking
|
||||
//! Autogenerated weights for `frame_benchmarking`
|
||||
//!
|
||||
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
|
||||
//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
|
||||
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0
|
||||
//! DATE: 2024-04-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
|
||||
//! WORST CASE MAP SIZE: `1000000`
|
||||
//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz`
|
||||
//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024
|
||||
//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz`
|
||||
//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024`
|
||||
|
||||
// Executed Command:
|
||||
// ./target/production/substrate
|
||||
// ./target/production/substrate-node
|
||||
// benchmark
|
||||
// pallet
|
||||
// --chain=dev
|
||||
@@ -35,12 +35,11 @@
|
||||
// --no-median-slopes
|
||||
// --no-min-squares
|
||||
// --extrinsic=*
|
||||
// --execution=wasm
|
||||
// --wasm-execution=compiled
|
||||
// --heap-pages=4096
|
||||
// --output=./frame/benchmarking/src/weights.rs
|
||||
// --header=./HEADER-APACHE2
|
||||
// --template=./.maintain/frame-weight-template.hbs
|
||||
// --output=./substrate/frame/benchmarking/src/weights.rs
|
||||
// --header=./substrate/HEADER-APACHE2
|
||||
// --template=./substrate/.maintain/frame-weight-template.hbs
|
||||
|
||||
#![cfg_attr(rustfmt, rustfmt_skip)]
|
||||
#![allow(unused_parens)]
|
||||
@@ -50,7 +49,7 @@
|
||||
use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}};
|
||||
use core::marker::PhantomData;
|
||||
|
||||
/// Weight functions needed for frame_benchmarking.
|
||||
/// Weight functions needed for `frame_benchmarking`.
|
||||
pub trait WeightInfo {
|
||||
fn addition(i: u32, ) -> Weight;
|
||||
fn subtraction(i: u32, ) -> Weight;
|
||||
@@ -60,7 +59,7 @@ pub trait WeightInfo {
|
||||
fn sr25519_verification(i: u32, ) -> Weight;
|
||||
}
|
||||
|
||||
/// Weights for frame_benchmarking using the Substrate node and recommended hardware.
|
||||
/// Weights for `frame_benchmarking` using the Substrate node and recommended hardware.
|
||||
pub struct SubstrateWeight<T>(PhantomData<T>);
|
||||
impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
|
||||
/// The range of component `i` is `[0, 1000000]`.
|
||||
@@ -68,101 +67,101 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 147_000 picoseconds.
|
||||
Weight::from_parts(185_656, 0)
|
||||
// Minimum execution time: 132_000 picoseconds.
|
||||
Weight::from_parts(160_546, 0)
|
||||
}
|
||||
/// The range of component `i` is `[0, 1000000]`.
|
||||
fn subtraction(_i: u32, ) -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 146_000 picoseconds.
|
||||
Weight::from_parts(189_816, 0)
|
||||
// Minimum execution time: 133_000 picoseconds.
|
||||
Weight::from_parts(171_395, 0)
|
||||
}
|
||||
/// The range of component `i` is `[0, 1000000]`.
|
||||
fn multiplication(_i: u32, ) -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 148_000 picoseconds.
|
||||
Weight::from_parts(202_367, 0)
|
||||
// Minimum execution time: 126_000 picoseconds.
|
||||
Weight::from_parts(166_417, 0)
|
||||
}
|
||||
/// The range of component `i` is `[0, 1000000]`.
|
||||
fn division(_i: u32, ) -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 143_000 picoseconds.
|
||||
Weight::from_parts(189_693, 0)
|
||||
// Minimum execution time: 131_000 picoseconds.
|
||||
Weight::from_parts(166_348, 0)
|
||||
}
|
||||
fn hashing() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 24_167_071_000 picoseconds.
|
||||
Weight::from_parts(24_391_749_000, 0)
|
||||
// Minimum execution time: 26_583_601_000 picoseconds.
|
||||
Weight::from_parts(26_795_212_000, 0)
|
||||
}
|
||||
/// The range of component `i` is `[0, 100]`.
|
||||
fn sr25519_verification(i: u32, ) -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 231_000 picoseconds.
|
||||
Weight::from_parts(2_998_013, 0)
|
||||
// Standard Error: 6_256
|
||||
.saturating_add(Weight::from_parts(55_456_705, 0).saturating_mul(i.into()))
|
||||
// Minimum execution time: 158_000 picoseconds.
|
||||
Weight::from_parts(5_277_102, 0)
|
||||
// Standard Error: 6_279
|
||||
.saturating_add(Weight::from_parts(40_610_511, 0).saturating_mul(i.into()))
|
||||
}
|
||||
}
|
||||
|
||||
// For backwards compatibility and tests
|
||||
// For backwards compatibility and tests.
|
||||
impl WeightInfo for () {
|
||||
/// The range of component `i` is `[0, 1000000]`.
|
||||
fn addition(_i: u32, ) -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 147_000 picoseconds.
|
||||
Weight::from_parts(185_656, 0)
|
||||
// Minimum execution time: 132_000 picoseconds.
|
||||
Weight::from_parts(160_546, 0)
|
||||
}
|
||||
/// The range of component `i` is `[0, 1000000]`.
|
||||
fn subtraction(_i: u32, ) -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 146_000 picoseconds.
|
||||
Weight::from_parts(189_816, 0)
|
||||
// Minimum execution time: 133_000 picoseconds.
|
||||
Weight::from_parts(171_395, 0)
|
||||
}
|
||||
/// The range of component `i` is `[0, 1000000]`.
|
||||
fn multiplication(_i: u32, ) -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 148_000 picoseconds.
|
||||
Weight::from_parts(202_367, 0)
|
||||
// Minimum execution time: 126_000 picoseconds.
|
||||
Weight::from_parts(166_417, 0)
|
||||
}
|
||||
/// The range of component `i` is `[0, 1000000]`.
|
||||
fn division(_i: u32, ) -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 143_000 picoseconds.
|
||||
Weight::from_parts(189_693, 0)
|
||||
// Minimum execution time: 131_000 picoseconds.
|
||||
Weight::from_parts(166_348, 0)
|
||||
}
|
||||
fn hashing() -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 24_167_071_000 picoseconds.
|
||||
Weight::from_parts(24_391_749_000, 0)
|
||||
// Minimum execution time: 26_583_601_000 picoseconds.
|
||||
Weight::from_parts(26_795_212_000, 0)
|
||||
}
|
||||
/// The range of component `i` is `[0, 100]`.
|
||||
fn sr25519_verification(i: u32, ) -> Weight {
|
||||
// Proof Size summary in bytes:
|
||||
// Measured: `0`
|
||||
// Estimated: `0`
|
||||
// Minimum execution time: 231_000 picoseconds.
|
||||
Weight::from_parts(2_998_013, 0)
|
||||
// Standard Error: 6_256
|
||||
.saturating_add(Weight::from_parts(55_456_705, 0).saturating_mul(i.into()))
|
||||
// Minimum execution time: 158_000 picoseconds.
|
||||
Weight::from_parts(5_277_102, 0)
|
||||
// Standard Error: 6_279
|
||||
.saturating_add(Weight::from_parts(40_610_511, 0).saturating_mul(i.into()))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user