mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-26 16:57:58 +00:00
1843ae83ba
* Benchmark extrinsic Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Reduce warmup and repeat Running this 1000 times with a full block takes ~33 minutes 🙈. Reducing it to ~3 minutes per default. Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Make ExistentialDeposit public Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Add 'bechmark extrinsic' command Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * fmt Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Add --list and cleanup Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Unrelated Clippy Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Clippy Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Fix tests and doc Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Move implementations up + fmt Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Dont use parameter_types macro Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Cache to_lowercase() call The .to_lowercase() on the builder is actually not needes since its already documented to only return lower case. Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Spelling Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Use correct nightly for fmt... Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Rename ED Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Fix compile Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Subtract block base weight Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Fixes Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Use tmp folder for test This should already be the case since --dev is passed but somehow not... Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Fix test Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io>
153 lines
4.4 KiB
Rust
153 lines
4.4 KiB
Rust
// This file is part of Substrate.
|
|
|
|
// Copyright (C) 2022 Parity Technologies (UK) Ltd.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
//! Contains the [`OverheadCmd`] as entry point for the CLI to execute
|
|
//! the *overhead* benchmarks.
|
|
|
|
use sc_block_builder::{BlockBuilderApi, BlockBuilderProvider};
|
|
use sc_cli::{CliConfiguration, ImportParams, Result, SharedParams};
|
|
use sc_client_api::Backend as ClientBackend;
|
|
use sc_service::Configuration;
|
|
use sp_api::{ApiExt, ProvideRuntimeApi};
|
|
use sp_runtime::{traits::Block as BlockT, OpaqueExtrinsic};
|
|
|
|
use clap::{Args, Parser};
|
|
use log::info;
|
|
use serde::Serialize;
|
|
use std::{fmt::Debug, sync::Arc};
|
|
|
|
use crate::{
|
|
extrinsic::{
|
|
bench::{Benchmark, BenchmarkParams as ExtrinsicBenchmarkParams},
|
|
ExtrinsicBuilder,
|
|
},
|
|
overhead::template::TemplateData,
|
|
shared::{HostInfoParams, WeightParams},
|
|
};
|
|
|
|
/// Benchmark the execution overhead per-block and per-extrinsic.
|
|
#[derive(Debug, Parser)]
|
|
pub struct OverheadCmd {
|
|
#[allow(missing_docs)]
|
|
#[clap(flatten)]
|
|
pub shared_params: SharedParams,
|
|
|
|
#[allow(missing_docs)]
|
|
#[clap(flatten)]
|
|
pub import_params: ImportParams,
|
|
|
|
#[allow(missing_docs)]
|
|
#[clap(flatten)]
|
|
pub params: OverheadParams,
|
|
}
|
|
|
|
/// Configures the benchmark, the post-processing and weight generation.
|
|
#[derive(Debug, Default, Serialize, Clone, PartialEq, Args)]
|
|
pub struct OverheadParams {
|
|
#[allow(missing_docs)]
|
|
#[clap(flatten)]
|
|
pub weight: WeightParams,
|
|
|
|
#[allow(missing_docs)]
|
|
#[clap(flatten)]
|
|
pub bench: ExtrinsicBenchmarkParams,
|
|
|
|
#[allow(missing_docs)]
|
|
#[clap(flatten)]
|
|
pub hostinfo: HostInfoParams,
|
|
}
|
|
|
|
/// Type of a benchmark.
|
|
#[derive(Serialize, Clone, PartialEq, Copy)]
|
|
pub(crate) enum BenchmarkType {
|
|
/// Measure the per-extrinsic execution overhead.
|
|
Extrinsic,
|
|
/// Measure the per-block execution overhead.
|
|
Block,
|
|
}
|
|
|
|
impl OverheadCmd {
|
|
/// Measure the per-block and per-extrinsic execution overhead.
|
|
///
|
|
/// Writes the results to console and into two instances of the
|
|
/// `weights.hbs` template, one for each benchmark.
|
|
pub fn run<Block, BA, C>(
|
|
&self,
|
|
cfg: Configuration,
|
|
client: Arc<C>,
|
|
inherent_data: sp_inherents::InherentData,
|
|
ext_builder: &dyn ExtrinsicBuilder,
|
|
) -> Result<()>
|
|
where
|
|
Block: BlockT<Extrinsic = OpaqueExtrinsic>,
|
|
BA: ClientBackend<Block>,
|
|
C: BlockBuilderProvider<BA, Block, C> + ProvideRuntimeApi<Block>,
|
|
C::Api: ApiExt<Block, StateBackend = BA::State> + BlockBuilderApi<Block>,
|
|
{
|
|
if ext_builder.pallet() != "system" || ext_builder.extrinsic() != "remark" {
|
|
return Err(format!("The extrinsic builder is required to build `System::Remark` extrinsics but builds `{}` extrinsics instead", ext_builder.name()).into());
|
|
}
|
|
let bench = Benchmark::new(client, self.params.bench.clone(), inherent_data);
|
|
|
|
// per-block execution overhead
|
|
{
|
|
let stats = bench.bench_block()?;
|
|
info!("Per-block execution overhead [ns]:\n{:?}", stats);
|
|
let template = TemplateData::new(BenchmarkType::Block, &cfg, &self.params, &stats)?;
|
|
template.write(&self.params.weight.weight_path)?;
|
|
}
|
|
// per-extrinsic execution overhead
|
|
{
|
|
let stats = bench.bench_extrinsic(ext_builder)?;
|
|
info!("Per-extrinsic execution overhead [ns]:\n{:?}", stats);
|
|
let template = TemplateData::new(BenchmarkType::Extrinsic, &cfg, &self.params, &stats)?;
|
|
template.write(&self.params.weight.weight_path)?;
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
impl BenchmarkType {
|
|
/// Short name of the benchmark type.
|
|
pub(crate) fn short_name(&self) -> &'static str {
|
|
match self {
|
|
Self::Extrinsic => "extrinsic",
|
|
Self::Block => "block",
|
|
}
|
|
}
|
|
|
|
/// Long name of the benchmark type.
|
|
pub(crate) fn long_name(&self) -> &'static str {
|
|
match self {
|
|
Self::Extrinsic => "ExtrinsicBase",
|
|
Self::Block => "BlockExecution",
|
|
}
|
|
}
|
|
}
|
|
|
|
// Boilerplate
|
|
impl CliConfiguration for OverheadCmd {
|
|
fn shared_params(&self) -> &SharedParams {
|
|
&self.shared_params
|
|
}
|
|
|
|
fn import_params(&self) -> Option<&ImportParams> {
|
|
Some(&self.import_params)
|
|
}
|
|
}
|