cumulus_pallet_xcmp_queue/
weights_ext.rs1use crate::weights::WeightInfo;
19
20use frame_support::{traits::BatchFootprint, weights::Weight};
21use sp_runtime::SaturatedConversion;
22
23pub(crate) fn get_average_page_pos(max_message_len: u32) -> u32 {
24 max_message_len / 2
25}
26
27pub trait WeightInfoExt: WeightInfo {
29 fn uncached_enqueue_xcmp_messages() -> Weight {
30 Self::enqueue_n_full_pages(0)
31 }
32
33 fn enqueue_xcmp_messages(
34 first_page_pos: u32,
35 batch_footprint: &BatchFootprint,
36 is_first_sender_batch: bool,
37 ) -> Weight {
38 let message_count = batch_footprint.msgs_count.saturated_into();
39 let size_in_bytes = batch_footprint.size_in_bytes.saturated_into();
40
41 let pages_overhead = {
43 let full_message_overhead = Self::enqueue_n_full_pages(1)
44 .saturating_sub(Self::enqueue_n_empty_xcmp_messages(1));
45 let n_full_messages_overhead =
46 full_message_overhead.saturating_mul(batch_footprint.new_pages_count as u64);
47
48 Self::enqueue_n_full_pages(batch_footprint.new_pages_count)
49 .saturating_sub(Self::enqueue_n_full_pages(0))
50 .saturating_sub(n_full_messages_overhead)
51 };
52
53 let messages_overhead = {
55 Self::enqueue_n_empty_xcmp_messages(message_count)
56 .saturating_sub(Self::enqueue_n_empty_xcmp_messages(0))
57 };
58
59 let bytes_overhead = {
61 Self::enqueue_n_bytes_xcmp_message(size_in_bytes)
62 .saturating_sub(Self::enqueue_n_bytes_xcmp_message(0))
63 };
64
65 let pos_overhead = {
68 let mut pos_overhead = Self::enqueue_empty_xcmp_message_at(first_page_pos)
69 .saturating_sub(Self::enqueue_empty_xcmp_message_at(0));
70 if !is_first_sender_batch {
73 pos_overhead = pos_overhead.set_proof_size(0);
74 }
75 pos_overhead
76 };
77
78 pages_overhead
79 .saturating_add(messages_overhead)
80 .saturating_add(bytes_overhead)
81 .saturating_add(pos_overhead)
82 }
83
84 fn check_accuracy<MaxMessageLen: bounded_collections::Get<u32>>(err_margin: f64) {
85 assert!(err_margin < 1f64);
86
87 let estimated_weight =
88 Self::uncached_enqueue_xcmp_messages().saturating_add(Self::enqueue_xcmp_messages(
89 get_average_page_pos(MaxMessageLen::get()),
90 &BatchFootprint { msgs_count: 1000, size_in_bytes: 3000, new_pages_count: 0 },
91 true,
92 ));
93 let actual_weight = Self::enqueue_1000_small_xcmp_messages();
94
95 approx::assert_relative_eq!(
97 estimated_weight.ref_time() as f64,
98 actual_weight.ref_time() as f64,
99 max_relative = err_margin
100 );
101 }
102}
103
104impl<T: WeightInfo> WeightInfoExt for T {}