diff --git a/resources/weight_analyzer/Cargo.toml b/resources/weight_analyzer/Cargo.toml index 1711ec159e131049d4ff5642918b626a99b8e92a..37f396f6973e38bd258aa7402ff48ea175ee8c6d 100644 --- a/resources/weight_analyzer/Cargo.toml +++ b/resources/weight_analyzer/Cargo.toml @@ -10,6 +10,10 @@ version = '0.0.0' [workspace] +[lib] +name = "weightanalyzer" +path = "src/lib.rs" + [dependencies] subweight-core = "3.3.1" glob = "0.3.1" diff --git a/resources/weight_analyzer/src/main.rs b/resources/weight_analyzer/src/lib.rs similarity index 54% rename from resources/weight_analyzer/src/main.rs rename to resources/weight_analyzer/src/lib.rs index 2acb7f7762525ad803a7100784ab6c1b789f780a..948138ee743a2021749e218e77ff21d6aecd0a14 100644 --- a/resources/weight_analyzer/src/main.rs +++ b/resources/weight_analyzer/src/lib.rs @@ -17,45 +17,63 @@ pub struct WeightInfo { pub relative_weight: f64, } -fn main() { - let pallet_weights = read_pallet_weight(); - let db_weight = read_db_weight(); - let _overhead_weights = read_overhead_weight(); +/// Returns a HashMap <pallet_name, <extrinsic_name, weigh_info>> +/// of the analyzed weights. +/// +/// # Arguments +/// +/// * `folder_path` - A Path to a folder where the weight files are stored. +/// `paritydb_weights.rs` is mandatory and pallet weights should start by +/// `pallet_`. +/// +/// # Examples +/// +/// ``` +/// let weight_by_pallet = analyze_weight(Path::new("../../runtime/common/src/weights/")); +/// println!("{:?}", weight_by_pallet); +/// ``` +pub fn analyze_weight(folder_path: &Path) -> Option<HashMap<String, HashMap<String, WeightInfo>>> { + let pallet_weights = read_pallet_weight(folder_path); + let db_weight = read_db_weight(folder_path); + let _overhead_weights = read_overhead_weight(folder_path); // 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); + process(pallet_weights, scope) } -fn read_pallet_weight() -> Vec<Vec<ChromaticExtrinsic>> { +fn read_pallet_weight(folder_path: &Path) -> 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) + for path in glob( + folder_path + .join("pallet_*") + .to_str() + .expect("Invalid pallet path"), + ) + .expect("Invalid pallet pattern") + .filter_map(Result::ok) { let file = subweight_core::parse::pallet::parse_file(&path); if let Ok(file) = file { parsed_files.push(file); } } + if parsed_files.is_empty() { + panic!("No pallet found"); + } 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_db_weight(folder_path: &Path) -> Weights { + subweight_core::parse::storage::parse_file(folder_path.join("paritydb_weights.rs").as_path()) + .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 read_overhead_weight(folder_path: &Path) -> Weight { + subweight_core::parse::overhead::parse_file(folder_path.join("block_weights.rs").as_path()) + .expect("No overhead weight") } fn evaluate_weight( @@ -92,7 +110,10 @@ fn evaluate_weight( fn process( pallet_weights: Vec<Vec<ChromaticExtrinsic>>, mut scope: Scope<Term<u128>>, -) -> HashMap<String, HashMap<String, WeightInfo>> { +) -> Option<HashMap<String, HashMap<String, WeightInfo>>> { + if pallet_weights.is_empty() { + return None; + } let mut weight_by_pallet = HashMap::new(); for i in pallet_weights { for j in i { @@ -100,5 +121,16 @@ fn process( weight_by_pallet.insert(pallet.clone(), HashMap::from([(extrinsic.clone(), weight)])); } } - weight_by_pallet + Some(weight_by_pallet) +} + +#[cfg(test)] +mod tests { + use crate::analyze_weight; + use std::path::Path; + #[test] + fn should_works() { + let weight_by_pallet = analyze_weight(Path::new("../../runtime/common/src/weights/")); + println!("{:?}", weight_by_pallet); // cargo test -- --nocapture + } }