Speed up storage iteration from within the runtime (#13479)

* Speed up storage iteration from within the runtime

* Move the cached iterator into an `Option`

* Use `RefCell` in no_std

* Simplify the code slightly

* Use `Option::replace`

* Update doc comment for `next_storage_key_slow`
This commit is contained in:
Koute
2023-03-01 17:58:18 +09:00
committed by GitHub
parent 20bf3c938e
commit 55263fa2a1
9 changed files with 118 additions and 16 deletions
@@ -316,6 +316,19 @@ frame_benchmarking::benchmarks! {
call.dispatch_bypass_filter(RawOrigin::Root.into()).unwrap();
}
storage_iteration {
for i in 0..65000 {
UnboundedMapTwox::<T>::insert(i, sp_std::vec![0; 64]);
}
}: {
for (key, value) in UnboundedMapTwox::<T>::iter() {
unsafe {
core::ptr::read_volatile(&key);
core::ptr::read_volatile(value.as_ptr());
}
}
}
impl_benchmark_test_suite!(
Pallet,
mock::new_test_ext(),
@@ -107,6 +107,11 @@ pub mod pallet {
pub(crate) type UnboundedMap2<T: Config> =
StorageMap<Hasher = Blake2_256, Key = u32, Value = Vec<u32>, QueryKind = OptionQuery>;
#[pallet::storage]
#[pallet::unbounded]
pub(crate) type UnboundedMapTwox<T: Config> =
StorageMap<Hasher = Twox64Concat, Key = u32, Value = Vec<u32>, QueryKind = OptionQuery>;
#[pallet::event]
#[pallet::generate_deposit(pub(super) fn deposit_event)]
pub enum Event<T: Config> {