Skip to content
Snippets Groups Projects

Automatic weights documentation

Merged Benjamin Gallois requested to merge bgallois/duniter-v2s:weight-visualisation into master
2 files
+ 4
104
Compare changes
  • Side-by-side
  • Inline
Files
2
+ 0
104
use glob::glob;
use std::collections::HashMap;
use std::path::Path;
use subweight_core::parse::overhead::Weight;
use subweight_core::parse::pallet::ChromaticExtrinsic;
use subweight_core::parse::pallet::ComponentRange;
use subweight_core::parse::storage::Weights;
use subweight_core::scope::Scope;
use subweight_core::term::Term;
const MAX_BLOCK_WEIGHT: f64 = 2_000_000_000_000.; // TODO auto extraction from metadata using
// frame_system blockweights constant
#[derive(Debug)]
pub struct WeightInfo {
pub weight: u128,
pub relative_weight: f64,
}
fn main() {
let pallet_weights = read_pallet_weight();
let db_weight = read_db_weight();
let _overhead_weights = read_overhead_weight();
// Initialize scope with db weights
let mut scope = Scope::from_substrate();
scope = scope.with_storage_weights(db_weight.weights.read, db_weight.weights.write);
let weight_by_pallet = process(pallet_weights, scope);
println!("{:?}", weight_by_pallet);
}
fn read_pallet_weight() -> Vec<Vec<ChromaticExtrinsic>> {
let mut parsed_files = Vec::new();
for path in glob("../../runtime/common/src/weights/pallet_*")
.expect("No pallet found")
.filter_map(Result::ok)
{
let file = subweight_core::parse::pallet::parse_file(&path);
if let Ok(file) = file {
parsed_files.push(file);
}
}
parsed_files
}
fn read_db_weight() -> Weights {
subweight_core::parse::storage::parse_file(Path::new(
"../../runtime/common/src/weights/paritydb_weights.rs",
))
.expect("No DB weights")
}
fn read_overhead_weight() -> Weight {
subweight_core::parse::overhead::parse_file(Path::new(
"../../runtime/common/src/weights/block_weights.rs",
))
.expect("No overhead weight")
}
fn evaluate_weight(
extrinsic: ChromaticExtrinsic,
scope: &mut Scope<Term<u128>>,
) -> Result<(String, String, WeightInfo), String> {
// Extend the scope with the maximum value of the complexity parameter.
if let Some(params) = extrinsic.comp_ranges {
params
.iter()
.for_each(|(key, val): (&String, &ComponentRange)| {
scope.put_var(key.as_str(), Term::Scalar(val.max.into()));
});
}
// Evaluate the weight
let weight = extrinsic
.term
.simplify(subweight_core::Dimension::Time)
.expect("Can't evaluate")
.eval(scope)
.unwrap();
let relative_weight = (weight as f64) / MAX_BLOCK_WEIGHT * 100.;
Ok((
extrinsic.pallet,
extrinsic.name,
WeightInfo {
weight,
relative_weight,
},
))
}
fn process(
pallet_weights: Vec<Vec<ChromaticExtrinsic>>,
mut scope: Scope<Term<u128>>,
) -> HashMap<String, HashMap<String, WeightInfo>> {
let mut weight_by_pallet = HashMap::new();
for i in pallet_weights {
for j in i {
let (pallet, extrinsic, weight) = evaluate_weight(j, &mut scope).unwrap();
weight_by_pallet.insert(pallet.clone(), HashMap::from([(extrinsic.clone(), weight)]));
}
}
weight_by_pallet
}
Loading