Add baseline benchmark for sr25519 verification (#10414)

* Add baseline benchmark for sr25519 verification

* cargo run --quiet --release --features=runtime-benchmarks --manifest-path=bin/node/cli/Cargo.toml -- benchmark --chain=dev --steps=50 --repeat=20 --pallet=frame_benchmarking --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --output=./frame/benchmarking/src/weights.rs --template=./.maintain/frame-weight-template.hbs

* Register keystore for correct test externalities

* Update frame/benchmarking/src/baseline.rs

Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com>

* fix build

Co-authored-by: Parity Bot <admin@parity.io>
Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com>
This commit is contained in:
Zeke Mostov
2021-12-06 13:31:16 -08:00
committed by GitHub
parent b5b3e827ab
commit e65caa56d4
4 changed files with 77 additions and 22 deletions
+2
View File
@@ -1958,7 +1958,9 @@ dependencies = [
"paste 1.0.6", "paste 1.0.6",
"scale-info", "scale-info",
"sp-api", "sp-api",
"sp-application-crypto",
"sp-io", "sp-io",
"sp-keystore",
"sp-runtime", "sp-runtime",
"sp-runtime-interface", "sp-runtime-interface",
"sp-std", "sp-std",
+2
View File
@@ -22,6 +22,7 @@ sp-runtime-interface = { version = "4.0.0-dev", path = "../../primitives/runtime
sp-runtime = { version = "4.0.0-dev", path = "../../primitives/runtime", default-features = false } sp-runtime = { version = "4.0.0-dev", path = "../../primitives/runtime", default-features = false }
sp-std = { version = "4.0.0-dev", path = "../../primitives/std", default-features = false } sp-std = { version = "4.0.0-dev", path = "../../primitives/std", default-features = false }
sp-io = { version = "4.0.0-dev", path = "../../primitives/io", default-features = false } sp-io = { version = "4.0.0-dev", path = "../../primitives/io", default-features = false }
sp-application-crypto = { version = "4.0.0-dev", path = "../../primitives/application-crypto", default-features = false }
sp-storage = { version = "4.0.0-dev", path = "../../primitives/storage", default-features = false } sp-storage = { version = "4.0.0-dev", path = "../../primitives/storage", default-features = false }
frame-support = { version = "4.0.0-dev", default-features = false, path = "../support" } frame-support = { version = "4.0.0-dev", default-features = false, path = "../support" }
frame-system = { version = "4.0.0-dev", default-features = false, path = "../system" } frame-system = { version = "4.0.0-dev", default-features = false, path = "../system" }
@@ -29,6 +30,7 @@ log = { version = "0.4.14", default-features = false }
[dev-dependencies] [dev-dependencies]
hex-literal = "0.3.4" hex-literal = "0.3.4"
sp-keystore = { version = "0.10.0-dev", path = "../../primitives/keystore" }
[features] [features]
default = ["std"] default = ["std"]
+39 -2
View File
@@ -23,9 +23,23 @@
use crate::benchmarks; use crate::benchmarks;
use codec::Encode; use codec::Encode;
use frame_system::Pallet as System; use frame_system::Pallet as System;
use sp_runtime::traits::Hash; use sp_application_crypto::KeyTypeId;
use sp_runtime::{
traits::{AppVerify, Hash},
RuntimeAppPublic,
};
use sp_std::prelude::*; use sp_std::prelude::*;
pub const TEST_KEY_TYPE_ID: KeyTypeId = KeyTypeId(*b"test");
mod app_sr25519 {
use super::TEST_KEY_TYPE_ID;
use sp_application_crypto::{app_crypto, sr25519};
app_crypto!(sr25519, TEST_KEY_TYPE_ID);
}
type SignerId = app_sr25519::Public;
pub struct Pallet<T: Config>(System<T>); pub struct Pallet<T: Config>(System<T>);
pub trait Config: frame_system::Config {} pub trait Config: frame_system::Config {}
@@ -75,6 +89,23 @@ benchmarks! {
assert!(hash != T::Hash::default()); assert!(hash != T::Hash::default());
} }
sr25519_verification {
let i in 1 .. 100;
let public = SignerId::generate_pair(None);
let sigs_count: u8 = i.try_into().unwrap();
let msg_and_sigs: Vec<_> = (0..sigs_count).map(|j| {
let msg = vec![j, j];
(msg.clone(), public.sign(&msg).unwrap())
})
.collect();
}: {
msg_and_sigs.iter().for_each(|(msg, sig)| {
assert!(sig.verify(&msg[..], &public));
});
}
#[skip_meta] #[skip_meta]
storage_read { storage_read {
let i in 0 .. 1_000; let i in 0 .. 1_000;
@@ -169,7 +200,13 @@ pub mod mock {
impl super::Config for Test {} impl super::Config for Test {}
pub fn new_test_ext() -> sp_io::TestExternalities { pub fn new_test_ext() -> sp_io::TestExternalities {
use sp_keystore::{testing::KeyStore, KeystoreExt, SyncCryptoStorePtr};
use sp_std::sync::Arc;
let t = frame_system::GenesisConfig::default().build_storage::<Test>().unwrap(); let t = frame_system::GenesisConfig::default().build_storage::<Test>().unwrap();
sp_io::TestExternalities::new(t) let mut ext = sp_io::TestExternalities::new(t);
ext.register_extension(KeystoreExt(Arc::new(KeyStore::new()) as SyncCryptoStorePtr));
ext
} }
} }
+34 -20
View File
@@ -18,7 +18,7 @@
//! 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 //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
//! DATE: 2021-10-30, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! DATE: 2021-12-02, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]`
//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 128 //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 128
// Executed Command: // Executed Command:
@@ -35,7 +35,6 @@
// --output=./frame/benchmarking/src/weights.rs // --output=./frame/benchmarking/src/weights.rs
// --template=./.maintain/frame-weight-template.hbs // --template=./.maintain/frame-weight-template.hbs
#![cfg_attr(rustfmt, rustfmt_skip)] #![cfg_attr(rustfmt, rustfmt_skip)]
#![allow(unused_parens)] #![allow(unused_parens)]
#![allow(unused_imports)] #![allow(unused_imports)]
@@ -50,6 +49,7 @@ pub trait WeightInfo {
fn multiplication(i: u32, ) -> Weight; fn multiplication(i: u32, ) -> Weight;
fn division(i: u32, ) -> Weight; fn division(i: u32, ) -> Weight;
fn hashing(i: u32, ) -> Weight; fn hashing(i: u32, ) -> Weight;
fn sr25519_verification(i: u32, ) -> Weight;
fn storage_read(i: u32, ) -> Weight; fn storage_read(i: u32, ) -> Weight;
fn storage_write(i: u32, ) -> Weight; fn storage_write(i: u32, ) -> Weight;
} }
@@ -58,32 +58,39 @@ pub trait WeightInfo {
pub struct SubstrateWeight<T>(PhantomData<T>); pub struct SubstrateWeight<T>(PhantomData<T>);
impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> { impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
fn addition(_i: u32, ) -> Weight { fn addition(_i: u32, ) -> Weight {
(337_000 as Weight) (284_000 as Weight)
} }
fn subtraction(_i: u32, ) -> Weight { fn subtraction(_i: u32, ) -> Weight {
(343_000 as Weight) (279_000 as Weight)
} }
fn multiplication(_i: u32, ) -> Weight { fn multiplication(_i: u32, ) -> Weight {
(340_000 as Weight) (278_000 as Weight)
} }
fn division(_i: u32, ) -> Weight { fn division(_i: u32, ) -> Weight {
(346_000 as Weight) (274_000 as Weight)
} }
fn hashing(_i: u32, ) -> Weight { fn hashing(i: u32, ) -> Weight {
(35_449_143_000 as Weight) (33_441_957_000 as Weight)
// Standard Error: 535_000
.saturating_add((363_000 as Weight).saturating_mul(i as Weight))
}
fn sr25519_verification(i: u32, ) -> Weight {
(26_000 as Weight)
// Standard Error: 14_000
.saturating_add((48_151_000 as Weight).saturating_mul(i as Weight))
} }
// Storage: Skipped Metadata (r:0 w:0) // Storage: Skipped Metadata (r:0 w:0)
fn storage_read(i: u32, ) -> Weight { fn storage_read(i: u32, ) -> Weight {
(0 as Weight) (0 as Weight)
// Standard Error: 3_000 // Standard Error: 4_000
.saturating_add((2_851_000 as Weight).saturating_mul(i as Weight)) .saturating_add((2_694_000 as Weight).saturating_mul(i as Weight))
.saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(i as Weight))) .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(i as Weight)))
} }
// Storage: Skipped Metadata (r:0 w:0) // Storage: Skipped Metadata (r:0 w:0)
fn storage_write(i: u32, ) -> Weight { fn storage_write(i: u32, ) -> Weight {
(0 as Weight) (0 as Weight)
// Standard Error: 0 // Standard Error: 0
.saturating_add((662_000 as Weight).saturating_mul(i as Weight)) .saturating_add((606_000 as Weight).saturating_mul(i as Weight))
.saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(i as Weight))) .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(i as Weight)))
} }
} }
@@ -91,32 +98,39 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
// For backwards compatibility and tests // For backwards compatibility and tests
impl WeightInfo for () { impl WeightInfo for () {
fn addition(_i: u32, ) -> Weight { fn addition(_i: u32, ) -> Weight {
(337_000 as Weight) (284_000 as Weight)
} }
fn subtraction(_i: u32, ) -> Weight { fn subtraction(_i: u32, ) -> Weight {
(343_000 as Weight) (279_000 as Weight)
} }
fn multiplication(_i: u32, ) -> Weight { fn multiplication(_i: u32, ) -> Weight {
(340_000 as Weight) (278_000 as Weight)
} }
fn division(_i: u32, ) -> Weight { fn division(_i: u32, ) -> Weight {
(346_000 as Weight) (274_000 as Weight)
} }
fn hashing(_i: u32, ) -> Weight { fn hashing(i: u32, ) -> Weight {
(35_449_143_000 as Weight) (33_441_957_000 as Weight)
// Standard Error: 535_000
.saturating_add((363_000 as Weight).saturating_mul(i as Weight))
}
fn sr25519_verification(i: u32, ) -> Weight {
(26_000 as Weight)
// Standard Error: 14_000
.saturating_add((48_151_000 as Weight).saturating_mul(i as Weight))
} }
// Storage: Skipped Metadata (r:0 w:0) // Storage: Skipped Metadata (r:0 w:0)
fn storage_read(i: u32, ) -> Weight { fn storage_read(i: u32, ) -> Weight {
(0 as Weight) (0 as Weight)
// Standard Error: 3_000 // Standard Error: 4_000
.saturating_add((2_851_000 as Weight).saturating_mul(i as Weight)) .saturating_add((2_694_000 as Weight).saturating_mul(i as Weight))
.saturating_add(RocksDbWeight::get().reads((1 as Weight).saturating_mul(i as Weight))) .saturating_add(RocksDbWeight::get().reads((1 as Weight).saturating_mul(i as Weight)))
} }
// Storage: Skipped Metadata (r:0 w:0) // Storage: Skipped Metadata (r:0 w:0)
fn storage_write(i: u32, ) -> Weight { fn storage_write(i: u32, ) -> Weight {
(0 as Weight) (0 as Weight)
// Standard Error: 0 // Standard Error: 0
.saturating_add((662_000 as Weight).saturating_mul(i as Weight)) .saturating_add((606_000 as Weight).saturating_mul(i as Weight))
.saturating_add(RocksDbWeight::get().writes((1 as Weight).saturating_mul(i as Weight))) .saturating_add(RocksDbWeight::get().writes((1 as Weight).saturating_mul(i as Weight)))
} }
} }