Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
c13b500
extract repeat out of benchmark
shawntabrizi Jul 19, 2021
c309539
remove r
shawntabrizi Jul 19, 2021
e909b9d
unused
shawntabrizi Jul 19, 2021
6e70861
cargo run --quiet --release --features=runtime-benchmarks --manifest-…
Jul 19, 2021
30e9e5f
cargo run --quiet --release --features=runtime-benchmarks --manifest-…
Jul 19, 2021
66c1dbb
cargo run --quiet --release --features=runtime-benchmarks --manifest-…
Jul 19, 2021
cd01587
use linked map to keep order
shawntabrizi Jul 21, 2021
8c42f39
Merge branch 'master' of https://github.com/paritytech/substrate into…
Jul 21, 2021
d0184a0
cargo run --quiet --release --features=runtime-benchmarks --manifest-…
Jul 21, 2021
31810d9
Delete pallet_balances.rs
shawntabrizi Jul 21, 2021
1ab0066
Delete out
shawntabrizi Jul 21, 2021
257fbbb
cargo run --quiet --release --features=runtime-benchmarks --manifest-…
Jul 21, 2021
ca5cdc5
steps and repeat to tuple (current_*, total_*)
shawntabrizi Jul 22, 2021
f42d16f
idea for list command
shawntabrizi Jul 22, 2021
8a0ed37
Merge branch 'master' into shawntabrizi-refactor-benchmarks
shawntabrizi Jul 29, 2021
81a7e77
fmt
shawntabrizi Jul 29, 2021
9467179
use benchmark list in cli
shawntabrizi Jul 30, 2021
e760e3e
handle steps in cli
shawntabrizi Jul 30, 2021
630ab7a
move log update to cli
shawntabrizi Jul 30, 2021
d4b3f9d
fmt
shawntabrizi Jul 30, 2021
39bd8c0
remove old todo
shawntabrizi Jul 30, 2021
fb8fc17
line width
shawntabrizi Jul 30, 2021
0f713c7
Merge branch 'master' of https://github.com/paritytech/substrate into…
Jul 30, 2021
5627eba
cargo run --quiet --release --features=runtime-benchmarks --manifest-…
Jul 30, 2021
ced0514
benchmark metadata function
shawntabrizi Jul 30, 2021
1945af5
don't need this warm up
shawntabrizi Jul 30, 2021
b243b02
cargo run --quiet --release --features=runtime-benchmarks --manifest-…
Jul 30, 2021
14a4342
fix warnings
shawntabrizi Jul 30, 2021
ee3b2f7
fix node-template
shawntabrizi Jul 30, 2021
0ae6038
fix
shawntabrizi Jul 30, 2021
f2ae7a1
fmt
shawntabrizi Jul 31, 2021
b7fa4aa
line width
shawntabrizi Jul 31, 2021
f5a839b
cargo run --quiet --release --features=runtime-benchmarks --manifest-…
Jul 31, 2021
e3ad6dd
improve docs
shawntabrizi Jul 31, 2021
98b3280
improve cli
shawntabrizi Jul 31, 2021
cc6e48b
fix format
shawntabrizi Jul 31, 2021
8051bf1
fix bug?
shawntabrizi Aug 1, 2021
d62a13e
Revert "fix bug?"
shawntabrizi Aug 1, 2021
0e20a92
skip frame-metadata
shawntabrizi Aug 1, 2021
a6aa550
extract repeat out of benchmark
shawntabrizi Jul 19, 2021
5cbc0fe
remove r
shawntabrizi Jul 19, 2021
a7ed886
cargo run --quiet --release --features=runtime-benchmarks --manifest-…
Jul 19, 2021
4079b32
cargo run --quiet --release --features=runtime-benchmarks --manifest-…
Jul 19, 2021
fbd8e48
cargo run --quiet --release --features=runtime-benchmarks --manifest-…
Jul 19, 2021
05ee330
use linked map to keep order
shawntabrizi Jul 21, 2021
8cf07b4
cargo run --quiet --release --features=runtime-benchmarks --manifest-…
Jul 21, 2021
4518215
Delete pallet_balances.rs
shawntabrizi Jul 21, 2021
8de8043
Delete out
shawntabrizi Jul 21, 2021
8c27b0b
cargo run --quiet --release --features=runtime-benchmarks --manifest-…
Jul 21, 2021
69b5649
steps and repeat to tuple (current_*, total_*)
shawntabrizi Jul 22, 2021
bf949d0
idea for list command
shawntabrizi Jul 22, 2021
19553a7
fmt
shawntabrizi Jul 29, 2021
bea0029
use benchmark list in cli
shawntabrizi Jul 30, 2021
80d5ab3
handle steps in cli
shawntabrizi Jul 30, 2021
6f06056
move log update to cli
shawntabrizi Jul 30, 2021
7f88e7f
remove old todo
shawntabrizi Jul 30, 2021
cc4479a
line width
shawntabrizi Jul 30, 2021
83e5a49
cargo run --quiet --release --features=runtime-benchmarks --manifest-…
Jul 30, 2021
33a8243
benchmark metadata function
shawntabrizi Jul 30, 2021
a366ed2
don't need this warm up
shawntabrizi Jul 30, 2021
60cdd06
cargo run --quiet --release --features=runtime-benchmarks --manifest-…
Jul 30, 2021
a2c2dbd
fix warnings
shawntabrizi Jul 30, 2021
c8f7ce1
fix node-template
shawntabrizi Jul 30, 2021
0a3043b
fix
shawntabrizi Jul 30, 2021
04df7e8
fmt
shawntabrizi Jul 31, 2021
2a0d85e
line width
shawntabrizi Jul 31, 2021
20ccbc7
cargo run --quiet --release --features=runtime-benchmarks --manifest-…
Jul 31, 2021
4f1a560
improve docs
shawntabrizi Jul 31, 2021
e743100
improve cli
shawntabrizi Jul 31, 2021
f1fdbac
fix format
shawntabrizi Jul 31, 2021
2ed43f3
fix bug?
shawntabrizi Aug 1, 2021
17f33f8
Revert "fix bug?"
shawntabrizi Aug 1, 2021
70eeb9f
skip frame-metadata
shawntabrizi Aug 1, 2021
7420ed0
Merge branch 'shawntabrizi-refactor-benchmarks' of https://github.com…
shawntabrizi Aug 1, 2021
048b452
Update .gitlab-ci.yml
shawntabrizi Aug 1, 2021
0c0e112
fix import
shawntabrizi Aug 1, 2021
fec5ee2
Update .gitlab-ci.yml
shawntabrizi Aug 1, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
use benchmark list in cli
  • Loading branch information
shawntabrizi committed Jul 30, 2021
commit 9467179b5869ae91bd00feae0c841e3d68583a9c
64 changes: 48 additions & 16 deletions bin/node/runtime/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1535,18 +1535,54 @@ impl_runtime_apis! {
#[cfg(feature = "runtime-benchmarks")]
impl frame_benchmarking::Benchmark<Block> for Runtime {
fn benchmarks(extra: bool) -> Vec<frame_benchmarking::BenchmarkList> {
use frame_benchmarking::{Benchmarking, BenchmarkList};

let benchmarks = Assets::benchmarks(extra)
.iter()
.map(|b| b.to_vec())
.collect::<Vec<_>>();
let list = BenchmarkList {
pallet: b"Balances".to_vec(),
benchmarks: benchmarks.to_vec(),
};

return vec![list]
use frame_benchmarking::{list_benchmark, Benchmarking, BenchmarkList};

// Trying to add benchmarks directly to the Session Pallet caused cyclic dependency
// issues. To get around that, we separated the Session benchmarks into its own crate,
// which is why we need these two lines below.
use pallet_session_benchmarking::Pallet as SessionBench;
use pallet_offences_benchmarking::Pallet as OffencesBench;
use frame_system_benchmarking::Pallet as SystemBench;

impl pallet_session_benchmarking::Config for Runtime {}
impl pallet_offences_benchmarking::Config for Runtime {}
impl frame_system_benchmarking::Config for Runtime {}

let mut list = Vec::<BenchmarkList>::new();

list_benchmark!(list, extra, pallet_assets, Assets);
list_benchmark!(list, extra, pallet_babe, Babe);
list_benchmark!(list, extra, pallet_balances, Balances);
list_benchmark!(list, extra, pallet_bounties, Bounties);
list_benchmark!(list, extra, pallet_collective, Council);
list_benchmark!(list, extra, pallet_contracts, Contracts);
list_benchmark!(list, extra, pallet_democracy, Democracy);
list_benchmark!(list, extra, pallet_election_provider_multi_phase, ElectionProviderMultiPhase);
list_benchmark!(list, extra, pallet_elections_phragmen, Elections);
list_benchmark!(list, extra, pallet_gilt, Gilt);
list_benchmark!(list, extra, pallet_grandpa, Grandpa);
list_benchmark!(list, extra, pallet_identity, Identity);
list_benchmark!(list, extra, pallet_im_online, ImOnline);
list_benchmark!(list, extra, pallet_indices, Indices);
list_benchmark!(list, extra, pallet_lottery, Lottery);
list_benchmark!(list, extra, pallet_membership, TechnicalMembership);
list_benchmark!(list, extra, pallet_mmr, Mmr);
list_benchmark!(list, extra, pallet_multisig, Multisig);
list_benchmark!(list, extra, pallet_offences, OffencesBench::<Runtime>);
list_benchmark!(list, extra, pallet_proxy, Proxy);
list_benchmark!(list, extra, pallet_scheduler, Scheduler);
list_benchmark!(list, extra, pallet_session, SessionBench::<Runtime>);
list_benchmark!(list, extra, pallet_staking, Staking);
list_benchmark!(list, extra, frame_system, SystemBench::<Runtime>);
list_benchmark!(list, extra, pallet_timestamp, Timestamp);
list_benchmark!(list, extra, pallet_tips, Tips);
list_benchmark!(list, extra, pallet_transaction_storage, TransactionStorage);
list_benchmark!(list, extra, pallet_treasury, Treasury);
list_benchmark!(list, extra, pallet_uniques, Uniques);
list_benchmark!(list, extra, pallet_utility, Utility);
list_benchmark!(list, extra, pallet_vesting, Vesting);

return list
}

fn dispatch_benchmark(
Expand All @@ -1565,10 +1601,6 @@ impl_runtime_apis! {
use pallet_offences_benchmarking::Pallet as OffencesBench;
use frame_system_benchmarking::Pallet as SystemBench;

impl pallet_session_benchmarking::Config for Runtime {}
impl pallet_offences_benchmarking::Config for Runtime {}
impl frame_system_benchmarking::Config for Runtime {}

let whitelist: Vec<TrackedStorageKey> = vec![
// Block Number
hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(),
Expand Down
100 changes: 44 additions & 56 deletions frame/benchmarking/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1344,62 +1344,50 @@ macro_rules! add_benchmark {
verify,
extra,
} = config;
if &pallet[..] == &name_string[..] || &pallet[..] == &b"*"[..] {
if &pallet[..] == &b"*"[..] || &benchmark[..] == &b"*"[..] {
for benchmark in $( $location )*::benchmarks(*extra).into_iter() {
$batches.push($crate::BenchmarkBatch {
pallet: name_string.to_vec(),
instance: instance_string.to_vec(),
benchmark: benchmark.to_vec(),
results: $( $location )*::run_benchmark(
benchmark,
&lowest_range_values[..],
&highest_range_values[..],
*steps,
*repeat,
whitelist,
*verify,
).map_err(|e| {
$crate::show_benchmark_debug_info(
instance_string,
benchmark,
lowest_range_values,
highest_range_values,
steps,
repeat,
verify,
e,
)
})?,
});
}
} else {
$batches.push($crate::BenchmarkBatch {
pallet: name_string.to_vec(),
instance: instance_string.to_vec(),
benchmark: benchmark.clone(),
results: $( $location )*::run_benchmark(
&benchmark[..],
&lowest_range_values[..],
&highest_range_values[..],
*steps,
*repeat,
whitelist,
*verify,
).map_err(|e| {
$crate::show_benchmark_debug_info(
instance_string,
benchmark,
lowest_range_values,
highest_range_values,
steps,
repeat,
verify,
e,
)
})?,
});
}
if &pallet[..] == &name_string[..] {
$batches.push($crate::BenchmarkBatch {
pallet: name_string.to_vec(),
instance: instance_string.to_vec(),
benchmark: benchmark.clone(),
results: $( $location )*::run_benchmark(
&benchmark[..],
&lowest_range_values[..],
&highest_range_values[..],
*steps,
*repeat,
whitelist,
*verify,
).map_err(|e| {
$crate::show_benchmark_debug_info(
instance_string,
benchmark,
lowest_range_values,
highest_range_values,
steps,
repeat,
verify,
e,
)
})?
});
}
)
}

#[macro_export]
macro_rules! list_benchmark {
( $list:ident, $extra:ident, $name:path, $( $location:tt )* ) => (
let pallet_string = stringify!($name).as_bytes();
let instance_string = stringify!( $( $location )* ).as_bytes();
let benchmarks = $( $location )*::benchmarks($extra)
.iter()
.map(|b| b.to_vec())
.collect::<Vec<_>>();
let pallet_benchmarks = BenchmarkList {
pallet: pallet_string.to_vec(),
instance: instance_string.to_vec(),
benchmarks: benchmarks.to_vec(),
};
$list.push(pallet_benchmarks)
)
}
1 change: 1 addition & 0 deletions frame/benchmarking/src/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ pub struct BenchmarkConfig {
#[derive(Encode, Decode, Default, Clone, PartialEq, Debug)]
pub struct BenchmarkList {
pub pallet: Vec<u8>,
pub instance: Vec<u8>,
pub benchmarks: Vec<Vec<u8>>,
}

Expand Down
163 changes: 75 additions & 88 deletions utils/frame/benchmarking-cli/src/command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,8 @@ impl BenchmarkCmd {
let spec = config.chain_spec;
let wasm_method = self.wasm_method.into();
let strategy = self.execution.unwrap_or(ExecutionStrategy::Native);
let pallet = self.pallet.as_bytes();
let extrinsic = self.extrinsic.as_bytes();

let genesis_storage = spec.build_storage()?;
let mut changes = Default::default();
Expand All @@ -114,88 +116,103 @@ impl BenchmarkCmd {
let mut batches = Vec::new();
let mut storage_info = Vec::new();

for r in 0..self.repeat {
let extensions = || -> Extensions {
let mut extensions = Extensions::default();
extensions.register(KeystoreExt(Arc::new(KeyStore::new()) as SyncCryptoStorePtr));
let (offchain, _) = TestOffchainExt::new();
let (pool, _) = TestTransactionPoolExt::new();
extensions.register(OffchainWorkerExt::new(offchain.clone()));
extensions.register(OffchainDbExt::new(offchain));
extensions.register(TransactionPoolExt::new(pool));
return extensions
};

// Get Benchmark List
let result = StateMachine::<_, _, NumberFor<BB>, _>::new(
&state,
None,
&mut changes,
&executor,
"Benchmark_benchmarks",
&(self.extra).encode(),
extensions(),
&sp_state_machine::backend::BackendRuntimeCode::new(&state).runtime_code()?,
sp_core::testing::TaskExecutor::new(),
)
.execute(strategy.into())
.map_err(|e| format!("Error getting benchmark list: {:?}", e))?;

let list =
<Vec<frame_benchmarking::BenchmarkList> as Decode>::decode(&mut &result[..])
.map_err(|e| format!("Failed to decode benchmark list: {:?}", e))?;

if self.list {
// Show the list and exit early
for item in list {
println!("{}", String::from_utf8(item.pallet).unwrap());
for benchmark in item.benchmarks {
println!("- {}", String::from_utf8(benchmark).unwrap());
}
}
return Ok(())
}

if self.list {
// Use the benchmark list and the user input to determine the set of benchmarks to run.
let mut benchmarks_to_run = Vec::new();
for item in list {
if pallet == &item.pallet[..] || pallet == &b"*"[..] {
if &pallet[..] == &b"*"[..] || &extrinsic[..] == &b"*"[..] {
for benchmark in item.benchmarks {
benchmarks_to_run.push((item.pallet.clone(), benchmark));
}
} else {
benchmarks_to_run.push((pallet.to_vec(), extrinsic.to_vec()));
}
}
}

// Run the benchmarks
for (pallet, extrinsic) in benchmarks_to_run {
for r in 0..self.repeat {
let result = StateMachine::<_, _, NumberFor<BB>, _>::new(
&state,
None,
&mut changes,
&executor,
"Benchmark_benchmarks",
&(self.extra).encode(),
extensions,
"Benchmark_dispatch_benchmark",
&(
&pallet,
&extrinsic,
self.lowest_range_values.clone(),
self.highest_range_values.clone(),
(self.steps, self.steps),
(r, self.repeat),
!self.no_verify,
self.extra,
)
.encode(),
extensions(),
&sp_state_machine::backend::BackendRuntimeCode::new(&state).runtime_code()?,
sp_core::testing::TaskExecutor::new(),
)
.execute(strategy.into())
.map_err(|e| format!("Error getting benchmark list: {:?}", e))?;

let lists =
<Vec<frame_benchmarking::BenchmarkList> as Decode>::decode(&mut &result[..])
.map_err(|e| format!("Failed to decode benchmark list: {:?}", e))?;
.map_err(|e| format!("Error executing runtime benchmark: {:?}", e))?;

for list in lists {
println!("{}", String::from_utf8(list.pallet).unwrap());
for benchmark in list.benchmarks {
println!("- {}", String::from_utf8(benchmark).unwrap());
}
}
let (batch, last_storage_info) = <std::result::Result<
(Vec<BenchmarkBatch>, Vec<StorageInfo>),
String,
> as Decode>::decode(&mut &result[..])
.map_err(|e| format!("Failed to decode benchmark results: {:?}", e))??;

return Ok(())
batches.extend(batch);
storage_info = last_storage_info;
}

let result = StateMachine::<_, _, NumberFor<BB>, _>::new(
&state,
None,
&mut changes,
&executor,
"Benchmark_dispatch_benchmark",
&(
&self.pallet,
&self.extrinsic,
self.lowest_range_values.clone(),
self.highest_range_values.clone(),
(self.steps, self.steps),
(r, self.repeat),
!self.no_verify,
self.extra,
)
.encode(),
extensions,
&sp_state_machine::backend::BackendRuntimeCode::new(&state).runtime_code()?,
sp_core::testing::TaskExecutor::new(),
)
.execute(strategy.into())
.map_err(|e| format!("Error executing runtime benchmark: {:?}", e))?;

let (batch, last_storage_info) = <std::result::Result<
(Vec<BenchmarkBatch>, Vec<StorageInfo>),
String,
> as Decode>::decode(&mut &result[..])
.map_err(|e| format!("Failed to decode benchmark results: {:?}", e))??;

batches.extend(batch);
storage_info = last_storage_info;
}

// Combine all of the benchmark results, so that benchmarks of the same pallet/function
// are together.
let batches = combine_batches(batches);

for b in batches.clone() {
println!(
"{:?}: {:?}",
String::from_utf8(b.pallet).unwrap(),
String::from_utf8(b.benchmark).unwrap(),
);
}

if let Some(output_path) = &self.output {
crate::writer::write_results(&batches, &storage_info, output_path, self)?;
}
Expand Down Expand Up @@ -297,33 +314,3 @@ impl CliConfiguration for BenchmarkCmd {
})
}
}

// fn list<BB>(extra: bool) -> Result<()>
// where
// BB: BlockT + Debug,
// <<<BB as BlockT>::Header as HeaderT>::Number as std::str::FromStr>::Err: std::fmt::Debug,
// <BB as BlockT>::Hash: std::str::FromStr,
// {
// let result = StateMachine::<_, _, NumberFor<BB>, _>::new(
// &state,
// None,
// &mut changes,
// &executor,
// "Benchmark_benchmarks",
// &(extra).encode(),
// extensions,
// &sp_state_machine::backend::BackendRuntimeCode::new(&state).runtime_code()?,
// sp_core::testing::TaskExecutor::new(),
// )
// .execute(strategy.into())
// .map_err(|e| format!("Error getting benchmark list: {:?}", e))?;

// let list = <std::result::Result<
// Vec<frame_benchmarking::BenchmarkList>,
// String,
// > as Decode>::decode(&mut &result[..])
// .map_err(|e| format!("Failed to decode benchmark list: {:?}", e))??;

// println!("{:?}", list);
// Ok(())
// }