mirror of
https://git.proxmox.com/git/rustc
synced 2025-08-17 09:36:40 +00:00
746 lines
16 KiB
Rust
746 lines
16 KiB
Rust
#![feature(test)]
|
|
extern crate test;
|
|
extern crate rand;
|
|
extern crate fnv;
|
|
#[macro_use]
|
|
extern crate lazy_static;
|
|
|
|
use std::hash::Hash;
|
|
use fnv::FnvHasher;
|
|
use std::hash::BuildHasherDefault;
|
|
type FnvBuilder = BuildHasherDefault<FnvHasher>;
|
|
|
|
use test::Bencher;
|
|
use test::black_box;
|
|
|
|
extern crate indexmap;
|
|
|
|
use indexmap::IndexMap;
|
|
|
|
use std::collections::HashMap;
|
|
use std::iter::FromIterator;
|
|
|
|
use rand::{weak_rng, Rng};
|
|
|
|
#[bench]
|
|
fn new_hashmap(b: &mut Bencher) {
|
|
b.iter(|| {
|
|
HashMap::<String, String>::new()
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn new_orderedmap(b: &mut Bencher) {
|
|
b.iter(|| {
|
|
IndexMap::<String, String>::new()
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn with_capacity_10e5_hashmap(b: &mut Bencher) {
|
|
b.iter(|| {
|
|
HashMap::<String, String>::with_capacity(10_000)
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn with_capacity_10e5_orderedmap(b: &mut Bencher) {
|
|
b.iter(|| {
|
|
IndexMap::<String, String>::with_capacity(10_000)
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn insert_hashmap_10_000(b: &mut Bencher) {
|
|
let c = 10_000;
|
|
b.iter(|| {
|
|
let mut map = HashMap::with_capacity(c);
|
|
for x in 0..c {
|
|
map.insert(x, ());
|
|
}
|
|
map
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn insert_orderedmap_10_000(b: &mut Bencher) {
|
|
let c = 10_000;
|
|
b.iter(|| {
|
|
let mut map = IndexMap::with_capacity(c);
|
|
for x in 0..c {
|
|
map.insert(x, ());
|
|
}
|
|
map
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn insert_hashmap_string_10_000(b: &mut Bencher) {
|
|
let c = 10_000;
|
|
b.iter(|| {
|
|
let mut map = HashMap::with_capacity(c);
|
|
for x in 0..c {
|
|
map.insert(x.to_string(), ());
|
|
}
|
|
map
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn insert_orderedmap_string_10_000(b: &mut Bencher) {
|
|
let c = 10_000;
|
|
b.iter(|| {
|
|
let mut map = IndexMap::with_capacity(c);
|
|
for x in 0..c {
|
|
map.insert(x.to_string(), ());
|
|
}
|
|
map
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn insert_hashmap_str_10_000(b: &mut Bencher) {
|
|
let c = 10_000;
|
|
let ss = Vec::from_iter((0..c).map(|x| x.to_string()));
|
|
b.iter(|| {
|
|
let mut map = HashMap::with_capacity(c);
|
|
for key in &ss {
|
|
map.insert(&key[..], ());
|
|
}
|
|
map
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn insert_orderedmap_str_10_000(b: &mut Bencher) {
|
|
let c = 10_000;
|
|
let ss = Vec::from_iter((0..c).map(|x| x.to_string()));
|
|
b.iter(|| {
|
|
let mut map = IndexMap::with_capacity(c);
|
|
for key in &ss {
|
|
map.insert(&key[..], ());
|
|
}
|
|
map
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn insert_hashmap_int_bigvalue_10_000(b: &mut Bencher) {
|
|
let c = 10_000;
|
|
let value = [0u64; 10];
|
|
b.iter(|| {
|
|
let mut map = HashMap::with_capacity(c);
|
|
for i in 0..c {
|
|
map.insert(i, value);
|
|
}
|
|
map
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn insert_orderedmap_int_bigvalue_10_000(b: &mut Bencher) {
|
|
let c = 10_000;
|
|
let value = [0u64; 10];
|
|
b.iter(|| {
|
|
let mut map = IndexMap::with_capacity(c);
|
|
for i in 0..c {
|
|
map.insert(i, value);
|
|
}
|
|
map
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn insert_hashmap_100_000(b: &mut Bencher) {
|
|
let c = 100_000;
|
|
b.iter(|| {
|
|
let mut map = HashMap::with_capacity(c);
|
|
for x in 0..c {
|
|
map.insert(x, ());
|
|
}
|
|
map
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn insert_orderedmap_100_000(b: &mut Bencher) {
|
|
let c = 100_000;
|
|
b.iter(|| {
|
|
let mut map = IndexMap::with_capacity(c);
|
|
for x in 0..c {
|
|
map.insert(x, ());
|
|
}
|
|
map
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn insert_hashmap_150(b: &mut Bencher) {
|
|
let c = 150;
|
|
b.iter(|| {
|
|
let mut map = HashMap::with_capacity(c);
|
|
for x in 0..c {
|
|
map.insert(x, ());
|
|
}
|
|
map
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn insert_orderedmap_150(b: &mut Bencher) {
|
|
let c = 150;
|
|
b.iter(|| {
|
|
let mut map = IndexMap::with_capacity(c);
|
|
for x in 0..c {
|
|
map.insert(x, ());
|
|
}
|
|
map
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn entry_hashmap_150(b: &mut Bencher) {
|
|
let c = 150;
|
|
b.iter(|| {
|
|
let mut map = HashMap::with_capacity(c);
|
|
for x in 0..c {
|
|
map.entry(x).or_insert(());
|
|
}
|
|
map
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn entry_orderedmap_150(b: &mut Bencher) {
|
|
let c = 150;
|
|
b.iter(|| {
|
|
let mut map = IndexMap::with_capacity(c);
|
|
for x in 0..c {
|
|
map.entry(x).or_insert(());
|
|
}
|
|
map
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn iter_sum_hashmap_10_000(b: &mut Bencher) {
|
|
let c = 10_000;
|
|
let mut map = HashMap::with_capacity(c);
|
|
let len = c - c/10;
|
|
for x in 0..len {
|
|
map.insert(x, ());
|
|
}
|
|
assert_eq!(map.len(), len);
|
|
b.iter(|| {
|
|
map.keys().sum::<usize>()
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn iter_sum_orderedmap_10_000(b: &mut Bencher) {
|
|
let c = 10_000;
|
|
let mut map = IndexMap::with_capacity(c);
|
|
let len = c - c/10;
|
|
for x in 0..len {
|
|
map.insert(x, ());
|
|
}
|
|
assert_eq!(map.len(), len);
|
|
b.iter(|| {
|
|
map.keys().sum::<usize>()
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn iter_black_box_hashmap_10_000(b: &mut Bencher) {
|
|
let c = 10_000;
|
|
let mut map = HashMap::with_capacity(c);
|
|
let len = c - c/10;
|
|
for x in 0..len {
|
|
map.insert(x, ());
|
|
}
|
|
assert_eq!(map.len(), len);
|
|
b.iter(|| {
|
|
for &key in map.keys() {
|
|
black_box(key);
|
|
}
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn iter_black_box_orderedmap_10_000(b: &mut Bencher) {
|
|
let c = 10_000;
|
|
let mut map = IndexMap::with_capacity(c);
|
|
let len = c - c/10;
|
|
for x in 0..len {
|
|
map.insert(x, ());
|
|
}
|
|
assert_eq!(map.len(), len);
|
|
b.iter(|| {
|
|
for &key in map.keys() {
|
|
black_box(key);
|
|
}
|
|
});
|
|
}
|
|
|
|
fn shuffled_keys<I>(iter: I) -> Vec<I::Item>
|
|
where I: IntoIterator
|
|
{
|
|
let mut v = Vec::from_iter(iter);
|
|
let mut rng = weak_rng();
|
|
rng.shuffle(&mut v);
|
|
v
|
|
}
|
|
|
|
#[bench]
|
|
fn lookup_hashmap_10_000_exist(b: &mut Bencher) {
|
|
let c = 10_000;
|
|
let mut map = HashMap::with_capacity(c);
|
|
let keys = shuffled_keys(0..c);
|
|
for &key in &keys {
|
|
map.insert(key, 1);
|
|
}
|
|
b.iter(|| {
|
|
let mut found = 0;
|
|
for key in 5000..c {
|
|
found += map.get(&key).is_some() as i32;
|
|
}
|
|
found
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn lookup_hashmap_10_000_noexist(b: &mut Bencher) {
|
|
let c = 10_000;
|
|
let mut map = HashMap::with_capacity(c);
|
|
let keys = shuffled_keys(0..c);
|
|
for &key in &keys {
|
|
map.insert(key, 1);
|
|
}
|
|
b.iter(|| {
|
|
let mut found = 0;
|
|
for key in c..15000 {
|
|
found += map.get(&key).is_some() as i32;
|
|
}
|
|
found
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn lookup_orderedmap_10_000_exist(b: &mut Bencher) {
|
|
let c = 10_000;
|
|
let mut map = IndexMap::with_capacity(c);
|
|
let keys = shuffled_keys(0..c);
|
|
for &key in &keys {
|
|
map.insert(key, 1);
|
|
}
|
|
b.iter(|| {
|
|
let mut found = 0;
|
|
for key in 5000..c {
|
|
found += map.get(&key).is_some() as i32;
|
|
}
|
|
found
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn lookup_orderedmap_10_000_noexist(b: &mut Bencher) {
|
|
let c = 10_000;
|
|
let mut map = IndexMap::with_capacity(c);
|
|
let keys = shuffled_keys(0..c);
|
|
for &key in &keys {
|
|
map.insert(key, 1);
|
|
}
|
|
b.iter(|| {
|
|
let mut found = 0;
|
|
for key in c..15000 {
|
|
found += map.get(&key).is_some() as i32;
|
|
}
|
|
found
|
|
});
|
|
}
|
|
|
|
// number of items to look up
|
|
const LOOKUP_MAP_SIZE: u32 = 100_000_u32;
|
|
const LOOKUP_SAMPLE_SIZE: u32 = 5000;
|
|
const SORT_MAP_SIZE: usize = 10_000;
|
|
|
|
|
|
// use lazy_static so that comparison benchmarks use the exact same inputs
|
|
lazy_static! {
|
|
static ref KEYS: Vec<u32> = {
|
|
shuffled_keys(0..LOOKUP_MAP_SIZE)
|
|
};
|
|
}
|
|
|
|
lazy_static! {
|
|
static ref HMAP_100K: HashMap<u32, u32> = {
|
|
let c = LOOKUP_MAP_SIZE;
|
|
let mut map = HashMap::with_capacity(c as usize);
|
|
let keys = &*KEYS;
|
|
for &key in keys {
|
|
map.insert(key, key);
|
|
}
|
|
map
|
|
};
|
|
}
|
|
|
|
lazy_static! {
|
|
static ref OMAP_100K: IndexMap<u32, u32> = {
|
|
let c = LOOKUP_MAP_SIZE;
|
|
let mut map = IndexMap::with_capacity(c as usize);
|
|
let keys = &*KEYS;
|
|
for &key in keys {
|
|
map.insert(key, key);
|
|
}
|
|
map
|
|
};
|
|
}
|
|
|
|
lazy_static! {
|
|
static ref OMAP_SORT_U32: IndexMap<u32, u32> = {
|
|
let mut map = IndexMap::with_capacity(SORT_MAP_SIZE);
|
|
for &key in &KEYS[..SORT_MAP_SIZE] {
|
|
map.insert(key, key);
|
|
}
|
|
map
|
|
};
|
|
}
|
|
lazy_static! {
|
|
static ref OMAP_SORT_S: IndexMap<String, String> = {
|
|
let mut map = IndexMap::with_capacity(SORT_MAP_SIZE);
|
|
for &key in &KEYS[..SORT_MAP_SIZE] {
|
|
map.insert(format!("{:^16x}", &key), String::new());
|
|
}
|
|
map
|
|
};
|
|
}
|
|
|
|
#[bench]
|
|
fn lookup_hashmap_100_000_multi(b: &mut Bencher) {
|
|
let map = &*HMAP_100K;
|
|
b.iter(|| {
|
|
let mut found = 0;
|
|
for key in 0..LOOKUP_SAMPLE_SIZE {
|
|
found += map.get(&key).is_some() as u32;
|
|
}
|
|
found
|
|
});
|
|
}
|
|
|
|
|
|
#[bench]
|
|
fn lookup_ordermap_100_000_multi(b: &mut Bencher) {
|
|
let map = &*OMAP_100K;
|
|
b.iter(|| {
|
|
let mut found = 0;
|
|
for key in 0..LOOKUP_SAMPLE_SIZE {
|
|
found += map.get(&key).is_some() as u32;
|
|
}
|
|
found
|
|
});
|
|
}
|
|
|
|
// inorder: Test looking up keys in the same order as they were inserted
|
|
#[bench]
|
|
fn lookup_hashmap_100_000_inorder_multi(b: &mut Bencher) {
|
|
let map = &*HMAP_100K;
|
|
let keys = &*KEYS;
|
|
b.iter(|| {
|
|
let mut found = 0;
|
|
for key in &keys[0..LOOKUP_SAMPLE_SIZE as usize] {
|
|
found += map.get(key).is_some() as u32;
|
|
}
|
|
found
|
|
});
|
|
}
|
|
|
|
|
|
#[bench]
|
|
fn lookup_ordermap_100_000_inorder_multi(b: &mut Bencher) {
|
|
let map = &*OMAP_100K;
|
|
let keys = &*KEYS;
|
|
b.iter(|| {
|
|
let mut found = 0;
|
|
for key in &keys[0..LOOKUP_SAMPLE_SIZE as usize] {
|
|
found += map.get(key).is_some() as u32;
|
|
}
|
|
found
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn lookup_hashmap_100_000_single(b: &mut Bencher) {
|
|
let map = &*HMAP_100K;
|
|
let mut iter = (0..LOOKUP_MAP_SIZE + LOOKUP_SAMPLE_SIZE).cycle();
|
|
b.iter(|| {
|
|
let key = iter.next().unwrap();
|
|
map.get(&key).is_some()
|
|
});
|
|
}
|
|
|
|
|
|
#[bench]
|
|
fn lookup_ordermap_100_000_single(b: &mut Bencher) {
|
|
let map = &*OMAP_100K;
|
|
let mut iter = (0..LOOKUP_MAP_SIZE + LOOKUP_SAMPLE_SIZE).cycle();
|
|
b.iter(|| {
|
|
let key = iter.next().unwrap();
|
|
map.get(&key).is_some()
|
|
});
|
|
}
|
|
|
|
const GROW_SIZE: usize = 100_000;
|
|
type GrowKey = u32;
|
|
|
|
// Test grow/resize without preallocation
|
|
#[bench]
|
|
fn grow_fnv_hashmap_100_000(b: &mut Bencher) {
|
|
b.iter(|| {
|
|
let mut map: HashMap<_, _, FnvBuilder> = HashMap::default();
|
|
for x in 0..GROW_SIZE {
|
|
map.insert(x as GrowKey, x as GrowKey);
|
|
}
|
|
map
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn grow_fnv_ordermap_100_000(b: &mut Bencher) {
|
|
b.iter(|| {
|
|
let mut map: IndexMap<_, _, FnvBuilder> = IndexMap::default();
|
|
for x in 0..GROW_SIZE {
|
|
map.insert(x as GrowKey, x as GrowKey);
|
|
}
|
|
map
|
|
});
|
|
}
|
|
|
|
|
|
const MERGE: u64 = 10_000;
|
|
#[bench]
|
|
fn hashmap_merge_simple(b: &mut Bencher) {
|
|
let first_map: HashMap<u64, _> = (0..MERGE).map(|i| (i, ())).collect();
|
|
let second_map: HashMap<u64, _> = (MERGE..MERGE * 2).map(|i| (i, ())).collect();
|
|
b.iter(|| {
|
|
let mut merged = first_map.clone();
|
|
merged.extend(second_map.iter().map(|(&k, &v)| (k, v)));
|
|
merged
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn hashmap_merge_shuffle(b: &mut Bencher) {
|
|
let first_map: HashMap<u64, _> = (0..MERGE).map(|i| (i, ())).collect();
|
|
let second_map: HashMap<u64, _> = (MERGE..MERGE * 2).map(|i| (i, ())).collect();
|
|
let mut v = Vec::new();
|
|
let mut rng = weak_rng();
|
|
b.iter(|| {
|
|
let mut merged = first_map.clone();
|
|
v.extend(second_map.iter().map(|(&k, &v)| (k, v)));
|
|
rng.shuffle(&mut v);
|
|
merged.extend(v.drain(..));
|
|
|
|
merged
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn ordermap_merge_simple(b: &mut Bencher) {
|
|
let first_map: IndexMap<u64, _> = (0..MERGE).map(|i| (i, ())).collect();
|
|
let second_map: IndexMap<u64, _> = (MERGE..MERGE * 2).map(|i| (i, ())).collect();
|
|
b.iter(|| {
|
|
let mut merged = first_map.clone();
|
|
merged.extend(second_map.iter().map(|(&k, &v)| (k, v)));
|
|
merged
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn ordermap_merge_shuffle(b: &mut Bencher) {
|
|
let first_map: IndexMap<u64, _> = (0..MERGE).map(|i| (i, ())).collect();
|
|
let second_map: IndexMap<u64, _> = (MERGE..MERGE * 2).map(|i| (i, ())).collect();
|
|
let mut v = Vec::new();
|
|
let mut rng = weak_rng();
|
|
b.iter(|| {
|
|
let mut merged = first_map.clone();
|
|
v.extend(second_map.iter().map(|(&k, &v)| (k, v)));
|
|
rng.shuffle(&mut v);
|
|
merged.extend(v.drain(..));
|
|
|
|
merged
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn remove_ordermap_100_000(b: &mut Bencher) {
|
|
let map = OMAP_100K.clone();
|
|
let mut keys = Vec::from_iter(map.keys().cloned());
|
|
weak_rng().shuffle(&mut keys);
|
|
|
|
b.iter(|| {
|
|
let mut map = map.clone();
|
|
for key in &keys {
|
|
map.remove(key).is_some();
|
|
}
|
|
assert_eq!(map.len(), 0);
|
|
map
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn pop_ordermap_100_000(b: &mut Bencher) {
|
|
let map = OMAP_100K.clone();
|
|
|
|
b.iter(|| {
|
|
let mut map = map.clone();
|
|
while map.len() > 0 {
|
|
map.pop();
|
|
}
|
|
assert_eq!(map.len(), 0);
|
|
map
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn few_retain_ordermap_100_000(b: &mut Bencher) {
|
|
let map = OMAP_100K.clone();
|
|
|
|
b.iter(|| {
|
|
let mut map = map.clone();
|
|
map.retain(|k, _| *k % 7 == 0);
|
|
map
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn few_retain_hashmap_100_000(b: &mut Bencher) {
|
|
let map = HMAP_100K.clone();
|
|
|
|
b.iter(|| {
|
|
let mut map = map.clone();
|
|
map.retain(|k, _| *k % 7 == 0);
|
|
map
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn half_retain_ordermap_100_000(b: &mut Bencher) {
|
|
let map = OMAP_100K.clone();
|
|
|
|
b.iter(|| {
|
|
let mut map = map.clone();
|
|
map.retain(|k, _| *k % 2 == 0);
|
|
map
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn half_retain_hashmap_100_000(b: &mut Bencher) {
|
|
let map = HMAP_100K.clone();
|
|
|
|
b.iter(|| {
|
|
let mut map = map.clone();
|
|
map.retain(|k, _| *k % 2 == 0);
|
|
map
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn many_retain_ordermap_100_000(b: &mut Bencher) {
|
|
let map = OMAP_100K.clone();
|
|
|
|
b.iter(|| {
|
|
let mut map = map.clone();
|
|
map.retain(|k, _| *k % 100 != 0);
|
|
map
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn many_retain_hashmap_100_000(b: &mut Bencher) {
|
|
let map = HMAP_100K.clone();
|
|
|
|
b.iter(|| {
|
|
let mut map = map.clone();
|
|
map.retain(|k, _| *k % 100 != 0);
|
|
map
|
|
});
|
|
}
|
|
|
|
|
|
// simple sort impl for comparison
|
|
pub fn simple_sort<K: Ord + Hash, V>(m: &mut IndexMap<K, V>) {
|
|
let mut ordered: Vec<_> = m.drain(..).collect();
|
|
ordered.sort_by(|left, right| left.0.cmp(&right.0));
|
|
m.extend(ordered);
|
|
}
|
|
|
|
|
|
#[bench]
|
|
fn ordermap_sort_s(b: &mut Bencher) {
|
|
let map = OMAP_SORT_S.clone();
|
|
|
|
// there's a map clone there, but it's still useful to profile this
|
|
b.iter(|| {
|
|
let mut map = map.clone();
|
|
map.sort_keys();
|
|
map
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn ordermap_simple_sort_s(b: &mut Bencher) {
|
|
let map = OMAP_SORT_S.clone();
|
|
|
|
// there's a map clone there, but it's still useful to profile this
|
|
b.iter(|| {
|
|
let mut map = map.clone();
|
|
simple_sort(&mut map);
|
|
map
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn ordermap_sort_u32(b: &mut Bencher) {
|
|
let map = OMAP_SORT_U32.clone();
|
|
|
|
// there's a map clone there, but it's still useful to profile this
|
|
b.iter(|| {
|
|
let mut map = map.clone();
|
|
map.sort_keys();
|
|
map
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn ordermap_simple_sort_u32(b: &mut Bencher) {
|
|
let map = OMAP_SORT_U32.clone();
|
|
|
|
// there's a map clone there, but it's still useful to profile this
|
|
b.iter(|| {
|
|
let mut map = map.clone();
|
|
simple_sort(&mut map);
|
|
map
|
|
});
|
|
}
|
|
|
|
// measure the fixed overhead of cloning in sort benchmarks
|
|
#[bench]
|
|
fn ordermap_clone_for_sort_s(b: &mut Bencher) {
|
|
let map = OMAP_SORT_S.clone();
|
|
|
|
b.iter(|| {
|
|
map.clone()
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn ordermap_clone_for_sort_u32(b: &mut Bencher) {
|
|
let map = OMAP_SORT_U32.clone();
|
|
|
|
b.iter(|| {
|
|
map.clone()
|
|
});
|
|
}
|
|
|