Skip to content

Commit 31708ec

Browse files
committed
bench
1 parent 126c479 commit 31708ec

File tree

2 files changed

+58
-43
lines changed

2 files changed

+58
-43
lines changed

benches/lru.rs

Lines changed: 29 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,54 +3,49 @@
33

44
extern crate test;
55

6-
use std::mem::replace;
6+
use algorithm::{ArcCache, LfuCache, LruCache, LruKCache};
77
use test::Bencher;
88

9-
// bench: find the `BENCH_SIZE` first terms of the fibonacci sequence
10-
static BENCH_SIZE: usize = 30;
9+
static BENCH_SIZE: usize = 10000;
1110

12-
// recursive fibonacci
13-
fn fibonacci(n: usize) -> u32 {
14-
if n < 2 {
15-
1
16-
} else {
17-
fibonacci(n - 1) + fibonacci(n - 2)
18-
}
11+
macro_rules! do_test_bench {
12+
($cache: expr) => {
13+
for i in 0..BENCH_SIZE {
14+
$cache.insert(i, i);
15+
$cache.get(&i);
16+
}
17+
};
1918
}
20-
21-
// iterative fibonacci
22-
struct Fibonacci {
23-
curr: u32,
24-
next: u32,
19+
#[bench]
20+
fn calc_lru(b: &mut Bencher) {
21+
b.iter(|| {
22+
let mut lru = LruCache::new(BENCH_SIZE / 2);
23+
do_test_bench!(lru);
24+
})
2525
}
2626

27-
impl Iterator for Fibonacci {
28-
type Item = u32;
29-
fn next(&mut self) -> Option<u32> {
30-
let new_next = self.curr + self.next;
31-
let new_curr = replace(&mut self.next, new_next);
32-
33-
Some(replace(&mut self.curr, new_curr))
34-
}
35-
}
3627

37-
fn fibonacci_sequence() -> Fibonacci {
38-
Fibonacci { curr: 1, next: 1 }
28+
#[bench]
29+
fn calc_lruk(b: &mut Bencher) {
30+
b.iter(|| {
31+
let mut lruk = LruKCache::new(BENCH_SIZE / 2);
32+
do_test_bench!(lruk);
33+
})
3934
}
4035

41-
// function to benchmark must be annotated with `#[bench]`
4236
#[bench]
43-
fn recursive_fibonacci(b: &mut Bencher) {
44-
// exact code to benchmark must be passed as a closure to the iter
45-
// method of Bencher
37+
fn calc_lfu(b: &mut Bencher) {
4638
b.iter(|| {
47-
(0..BENCH_SIZE).map(fibonacci).collect::<Vec<u32>>()
39+
let mut lfu = LfuCache::new(BENCH_SIZE / 2);
40+
do_test_bench!(lfu);
4841
})
4942
}
5043

5144
#[bench]
52-
fn iterative_fibonacci(b: &mut Bencher) {
45+
fn calc_arc(b: &mut Bencher) {
5346
b.iter(|| {
54-
fibonacci_sequence().take(BENCH_SIZE).collect::<Vec<u32>>()
47+
let mut arc = ArcCache::new(BENCH_SIZE / 2);
48+
do_test_bench!(arc);
5549
})
56-
}
50+
}
51+

examples/bench_lru.rs

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@ macro_rules! do_test_bench {
1919
}
2020
}
2121
cost.push(now.elapsed().as_micros());
22-
println!("{}\t{}\t{:.2}%", $name, cost.iter().map(|v| v.to_string()).collect::<Vec<_>>().join("\t"), hit as f64 * 100.0 / all as f64);
22+
println!("|{}|{}|{:.2}%|", $name, cost.iter().map(|v| v.to_string()).collect::<Vec<_>>().join("\t"), hit as f64 * 100.0 / all as f64);
2323
};
2424
}
2525

26+
#[allow(dead_code)]
2627
fn build_order_data(num: usize) -> Vec<(usize, usize)> {
2728
let mut data = vec![];
2829
for i in 0..num {
@@ -32,11 +33,11 @@ fn build_order_data(num: usize) -> Vec<(usize, usize)> {
3233
data
3334
}
3435

36+
#[allow(dead_code)]
3537
fn build_freq_data(num: usize) -> Vec<(usize, usize)> {
3638
let mut data = vec![];
3739
for i in 0..num {
3840
data.push((i, i + 1));
39-
// data.push((i+1, i + 2));
4041
let ridx = i / 4 + 1;
4142
for _ in 0..1 {
4243
data.push((rand::random::<usize>() % ridx, 0));
@@ -45,19 +46,38 @@ fn build_freq_data(num: usize) -> Vec<(usize, usize)> {
4546
data
4647
}
4748

49+
50+
#[allow(dead_code)]
51+
fn build_high_freq_data(num: usize) -> Vec<(usize, usize)> {
52+
let mut data = vec![];
53+
for i in 0..num {
54+
data.push((i, i + 1));
55+
let ridx = (i / 4 + 1).min(1000);
56+
for _ in 0..10 {
57+
data.push((rand::random::<usize>() % ridx, 0));
58+
}
59+
for _ in 0..5 {
60+
data.push((i + num + rand::random::<usize>() % num, i + 1));
61+
}
62+
}
63+
data
64+
}
65+
4866
fn do_bench(num: usize) {
4967
let evict = num * 2;
5068
let mut lru = LruCache::<usize, usize, RandomState>::new(num);
5169
let mut lruk = LruKCache::<usize, usize, RandomState>::new(num);
5270
let mut lfu = LfuCache::<usize, usize, RandomState>::new(num);
5371
let mut arc = ArcCache::<usize, usize, RandomState>::new(num / 2);
54-
println!("名字\t耗时\t命中率\t");
55-
let order_data = build_freq_data(evict);
56-
do_test_bench!("LruCache", lru, num, evict, &order_data);
57-
// do_test_bench!("LruKCache", lruk, num, evict, &order_data);
58-
do_test_bench!("LfuCache", lfu, num, evict, &order_data);
59-
// do_test_bench!("ArcCache", arc, num, evict, &order_data);
60-
// println!("耗时:{}", set_timer);
72+
println!("|名字|耗时|命中率|");
73+
println!("|---|---|---|");
74+
// let data = build_freq_data(evict);
75+
let data = build_high_freq_data(evict);
76+
// let data = build_order_data(evict);
77+
do_test_bench!("LruCache", lru, num, evict, &data);
78+
do_test_bench!("LruKCache", lruk, num, evict, &data);
79+
do_test_bench!("LfuCache", lfu, num, evict, &data);
80+
do_test_bench!("ArcCache", arc, num, evict, &data);
6181
}
6282

6383
fn main() {

0 commit comments

Comments
 (0)