diff --git a/Cargo.lock b/Cargo.lock index d6a736a057c..a3c2f5189b8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5284,7 +5284,11 @@ dependencies = [ "pallet-session", "pallet-timestamp", "parity-scale-codec", +<<<<<<< HEAD "scale-info", +======= + "rand 0.7.3", +>>>>>>> 288a98d3... Fix Benchmarks for Statemine-V4 release (#639) "serde", "sp-consensus-aura", "sp-core", @@ -11518,7 +11522,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04f8ab788026715fa63b31960869617cba39117e520eb415b0139543e325ab59" dependencies = [ "cfg-if 0.1.10", - "rand 0.7.3", + "rand 0.6.5", "static_assertions", ] diff --git a/pallets/collator-selection/Cargo.toml b/pallets/collator-selection/Cargo.toml index b73e9a353e2..570ef7d5432 100644 --- a/pallets/collator-selection/Cargo.toml +++ b/pallets/collator-selection/Cargo.toml @@ -15,8 +15,10 @@ targets = ['x86_64-unknown-linux-gnu'] [dependencies] log = { version = "0.4.0", default-features = false } codec = { default-features = false, features = ['derive'], package = 'parity-scale-codec', version = '2.3.0' } +rand = { version = "0.7.2", default-features = false } scale-info = { version = "1.0.0", default-features = false, features = ["derive"] } serde = { version = "1.0.119", default-features = false } + sp-std = { default-features = false, git = 'https://github.com/paritytech/substrate', branch = "master" } sp-runtime = { default-features = false, git = 'https://github.com/paritytech/substrate', branch = "master" } sp-staking = { default-features = false, git = 'https://github.com/paritytech/substrate', branch = "master" } @@ -47,7 +49,11 @@ runtime-benchmarks = [ std = [ 'codec/std', 'log/std', +<<<<<<< HEAD 'scale-info/std', +======= + 'rand/std', +>>>>>>> 288a98d3... Fix Benchmarks for Statemine-V4 release (#639) 'sp-runtime/std', 'sp-staking/std', 'sp-std/std', diff --git a/pallets/collator-selection/src/benchmarking.rs b/pallets/collator-selection/src/benchmarking.rs index 49a8b1f0663..1b671c0f5f4 100644 --- a/pallets/collator-selection/src/benchmarking.rs +++ b/pallets/collator-selection/src/benchmarking.rs @@ -22,11 +22,12 @@ use crate::Pallet as CollatorSelection; use frame_benchmarking::{account, benchmarks, impl_benchmark_test_suite, whitelisted_caller}; use frame_support::{ assert_ok, - traits::{Currency, EnsureOrigin, Get}, + traits::{Currency, Get, EnsureOrigin}, + codec::Decode }; use frame_system::{EventRecord, RawOrigin}; use pallet_authorship::EventHandler; -use pallet_session::SessionManager; +use pallet_session::{self as session, SessionManager}; use sp_std::prelude::*; pub type BalanceOf = @@ -51,9 +52,52 @@ fn assert_last_event(generic_event: ::Event) { assert_eq!(event, &system_event); } +fn create_funded_user( + string: &'static str, + n: u32, + balance_factor: u32, +) -> T::AccountId { + let user = account(string, n, SEED); + let balance = T::Currency::minimum_balance() * balance_factor.into(); + let _ = T::Currency::make_free_balance_be(&user, balance); + user +} + +fn keys(c: u32) -> ::Keys { + use rand::{RngCore, SeedableRng}; + + let keys = { + let mut keys = [0u8; 128]; + + if c > 0 { + let mut rng = rand::rngs::StdRng::seed_from_u64(c as u64); + rng.fill_bytes(&mut keys); + } + + keys + }; + + Decode::decode(&mut &keys[..]).unwrap() +} + +fn validator(c: u32)-> (T::AccountId, ::Keys) { + (create_funded_user::("candidate", c, 1000), keys::(c)) +} + +fn register_validators(count: u32) { + let validators = (0..count).map(|c| validator::(c)).collect::>(); + + for (who, keys) in validators { + >::set_keys( + RawOrigin::Signed(who).into(), keys, vec![] + ).unwrap(); + } +} + fn register_candidates(count: u32) { let candidates = (0..count).map(|c| account("candidate", c, SEED)).collect::>(); assert!(>::get() > 0u32.into(), "Bond cannot be zero!"); + for who in candidates { T::Currency::make_free_balance_be(&who, >::get() * 2u32.into()); >::register_as_candidate(RawOrigin::Signed(who).into()).unwrap(); @@ -61,7 +105,7 @@ fn register_candidates(count: u32) { } benchmarks! { - where_clause { where T: pallet_authorship::Config } + where_clause { where T: pallet_authorship::Config + session::Config } set_invulnerables { let b in 1 .. T::MaxInvulnerables::get(); @@ -107,12 +151,20 @@ benchmarks! { >::put(T::Currency::minimum_balance()); >::put(c + 1); + + register_validators::(c); register_candidates::(c); let caller: T::AccountId = whitelisted_caller(); let bond: BalanceOf = T::Currency::minimum_balance() * 2u32.into(); T::Currency::make_free_balance_be(&caller, bond.clone()); + >::set_keys( + RawOrigin::Signed(caller.clone()).into(), + keys::(c + 1), + vec![] + ).unwrap(); + }: _(RawOrigin::Signed(caller.clone())) verify { assert_last_event::(Event::CandidateAdded(caller, bond / 2u32.into()).into()); @@ -120,9 +172,11 @@ benchmarks! { // worse case is the last candidate leaving. leave_intent { - let c in 1 .. T::MaxCandidates::get(); + let c in (T::MinCandidates::get() + 1) .. T::MaxCandidates::get(); >::put(T::Currency::minimum_balance()); >::put(c); + + register_validators::(c); register_candidates::(c); let leaving = >::get().last().unwrap().who.clone(); @@ -160,6 +214,8 @@ benchmarks! { >::put(T::Currency::minimum_balance()); >::put(c); frame_system::Pallet::::set_block_number(0u32.into()); + + register_validators::(c); register_candidates::(c); let new_block: T::BlockNumber = 1800u32.into(); @@ -171,19 +227,32 @@ benchmarks! { for i in 0..c { >::insert(candidates[i as usize].who.clone(), zero_block); } - for i in 0..non_removals { - >::insert(candidates[i as usize].who.clone(), new_block); + + if non_removals > 0 { + for i in 0..non_removals { + >::insert(candidates[i as usize].who.clone(), new_block); + } + } else { + for i in 0..c { + >::insert(candidates[i as usize].who.clone(), new_block); + } } let pre_length = >::get().len(); + frame_system::Pallet::::set_block_number(new_block); assert!(>::get().len() == c as usize); - }: { as SessionManager<_>>::new_session(0) } verify { - assert!(>::get().len() < pre_length); + if c > r && non_removals >= T::MinCandidates::get() { + assert!(>::get().len() < pre_length); + } else if c > r && non_removals < T::MinCandidates::get() { + assert!(>::get().len() == T::MinCandidates::get() as usize); + } else { + assert!(>::get().len() == pre_length); + } } } diff --git a/scripts/benchmarks.sh b/scripts/benchmarks.sh index eee548dd613..6bcb2d39800 100755 --- a/scripts/benchmarks.sh +++ b/scripts/benchmarks.sh @@ -2,10 +2,15 @@ steps=50 repeat=20 -statemineOutput=./polkadot-parachains/statemine-runtime/src/weights -statemintOutput=./polkadot-parachains/statemint-runtime/src/weights + +statemineOutput=./polkadot-parachains/statemine/src/weights +statemintOutput=./polkadot-parachains/statemint/src/weights +westmintOutput=./polkadot-parachains/westmint/src/weights + statemineChain=statemine-dev statemintChain=statemint-dev +westmintChain=westmint-dev + pallets=( pallet_assets pallet_balances @@ -15,6 +20,7 @@ pallets=( pallet_session pallet_timestamp pallet_utility + pallet_uniques ) for p in ${pallets[@]} @@ -28,6 +34,7 @@ do --steps=$steps \ --repeat=$repeat \ --raw \ + --header=./file_header.txt \ --output=$statemineOutput ./target/release/polkadot-collator benchmark \ @@ -39,6 +46,18 @@ do --steps=$steps \ --repeat=$repeat \ --raw \ + --header=./file_header.txt \ --output=$statemintOutput + ./target/release/polkadot-collator benchmark \ + --chain=$westmintChain \ + --execution=wasm \ + --wasm-execution=compiled \ + --pallet=$p \ + --extrinsic='*' \ + --steps=$steps \ + --repeat=$repeat \ + --raw \ + --header=./file_header.txt \ + --output=$westmintOutput done