Skip to content

Commit 79c21d9

Browse files
committed
adding iterator benches to tree-based maps for comparison purposes
1 parent a2e7c4d commit 79c21d9

File tree

3 files changed

+92
-18
lines changed

3 files changed

+92
-18
lines changed

src/libcollections/btree/map.rs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1145,9 +1145,12 @@ mod test {
11451145

11461146
#[cfg(test)]
11471147
mod bench {
1148-
use test::Bencher;
1148+
use std::prelude::*;
1149+
use std::rand::{weak_rng, Rng};
1150+
use test::{Bencher, black_box};
11491151

11501152
use super::BTreeMap;
1153+
use MutableMap;
11511154
use deque::bench::{insert_rand_n, insert_seq_n, find_rand_n, find_seq_n};
11521155

11531156
#[bench]
@@ -1200,4 +1203,34 @@ mod bench {
12001203
let mut m : BTreeMap<uint,uint> = BTreeMap::new();
12011204
find_seq_n(10_000, &mut m, b);
12021205
}
1206+
1207+
fn bench_iter(b: &mut Bencher, size: uint) {
1208+
let mut map = BTreeMap::<uint, uint>::new();
1209+
let mut rng = weak_rng();
1210+
1211+
for _ in range(0, size) {
1212+
map.swap(rng.gen(), rng.gen());
1213+
}
1214+
1215+
b.iter(|| {
1216+
for entry in map.iter() {
1217+
black_box(entry);
1218+
}
1219+
});
1220+
}
1221+
1222+
#[bench]
1223+
pub fn iter_20(b: &mut Bencher) {
1224+
bench_iter(b, 20);
1225+
}
1226+
1227+
#[bench]
1228+
pub fn iter_1000(b: &mut Bencher) {
1229+
bench_iter(b, 1000);
1230+
}
1231+
1232+
#[bench]
1233+
pub fn iter_100000(b: &mut Bencher) {
1234+
bench_iter(b, 100000);
1235+
}
12031236
}

src/libcollections/treemap.rs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2232,9 +2232,12 @@ mod test_treemap {
22322232

22332233
#[cfg(test)]
22342234
mod bench {
2235-
use test::Bencher;
2235+
use std::prelude::*;
2236+
use std::rand::{weak_rng, Rng};
2237+
use test::{Bencher, black_box};
22362238

22372239
use super::TreeMap;
2240+
use MutableMap;
22382241
use deque::bench::{insert_rand_n, insert_seq_n, find_rand_n, find_seq_n};
22392242

22402243
// Find seq
@@ -2288,6 +2291,36 @@ mod bench {
22882291
let mut m : TreeMap<uint,uint> = TreeMap::new();
22892292
find_seq_n(10_000, &mut m, b);
22902293
}
2294+
2295+
fn bench_iter(b: &mut Bencher, size: uint) {
2296+
let mut map = TreeMap::<uint, uint>::new();
2297+
let mut rng = weak_rng();
2298+
2299+
for _ in range(0, size) {
2300+
map.swap(rng.gen(), rng.gen());
2301+
}
2302+
2303+
b.iter(|| {
2304+
for entry in map.iter() {
2305+
black_box(entry);
2306+
}
2307+
});
2308+
}
2309+
2310+
#[bench]
2311+
pub fn iter_20(b: &mut Bencher) {
2312+
bench_iter(b, 20);
2313+
}
2314+
2315+
#[bench]
2316+
pub fn iter_1000(b: &mut Bencher) {
2317+
bench_iter(b, 1000);
2318+
}
2319+
2320+
#[bench]
2321+
pub fn iter_100000(b: &mut Bencher) {
2322+
bench_iter(b, 100000);
2323+
}
22912324
}
22922325

22932326
#[cfg(test)]

src/libcollections/trie.rs

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -948,8 +948,8 @@ macro_rules! iterator_impl {
948948
// rules, and are just manipulating raw pointers like there's no
949949
// such thing as invalid pointers and memory unsafety. The
950950
// reason is performance, without doing this we can get the
951-
// bench_iter_large microbenchmark down to about 30000 ns/iter
952-
// (using .unsafe_get to index self.stack directly, 38000
951+
// (now replaced) bench_iter_large microbenchmark down to about
952+
// 30000 ns/iter (using .unsafe_get to index self.stack directly, 38000
953953
// ns/iter with [] checked indexing), but this smashes that down
954954
// to 13500 ns/iter.
955955
//
@@ -1458,31 +1458,39 @@ mod test_map {
14581458
mod bench_map {
14591459
use std::prelude::*;
14601460
use std::rand::{weak_rng, Rng};
1461-
use test::Bencher;
1461+
use test::{Bencher, black_box};
14621462

14631463
use MutableMap;
14641464
use super::TrieMap;
14651465

1466-
#[bench]
1467-
fn bench_iter_small(b: &mut Bencher) {
1468-
let mut m = TrieMap::<uint>::new();
1466+
fn bench_iter(b: &mut Bencher, size: uint) {
1467+
let mut map = TrieMap::<uint>::new();
14691468
let mut rng = weak_rng();
1470-
for _ in range(0u, 20) {
1471-
m.insert(rng.gen(), rng.gen());
1469+
1470+
for _ in range(0, size) {
1471+
map.swap(rng.gen(), rng.gen());
14721472
}
14731473

1474-
b.iter(|| for _ in m.iter() {})
1474+
b.iter(|| {
1475+
for entry in map.iter() {
1476+
black_box(entry);
1477+
}
1478+
});
14751479
}
14761480

14771481
#[bench]
1478-
fn bench_iter_large(b: &mut Bencher) {
1479-
let mut m = TrieMap::<uint>::new();
1480-
let mut rng = weak_rng();
1481-
for _ in range(0u, 1000) {
1482-
m.insert(rng.gen(), rng.gen());
1483-
}
1482+
pub fn iter_20(b: &mut Bencher) {
1483+
bench_iter(b, 20);
1484+
}
14841485

1485-
b.iter(|| for _ in m.iter() {})
1486+
#[bench]
1487+
pub fn iter_1000(b: &mut Bencher) {
1488+
bench_iter(b, 1000);
1489+
}
1490+
1491+
#[bench]
1492+
pub fn iter_100000(b: &mut Bencher) {
1493+
bench_iter(b, 100000);
14861494
}
14871495

14881496
#[bench]

0 commit comments

Comments
 (0)