2
2
3
3
extern crate test;
4
4
5
- use test:: Bencher ;
5
+ use test:: { black_box , Bencher } ;
6
6
7
7
use byte_pool:: BytePool ;
8
8
9
9
fn touch_obj ( buf : & mut [ u8 ] , size : usize ) {
10
10
assert_eq ! ( buf. len( ) , size) ;
11
11
buf[ 0 ] = 1 ;
12
+ black_box ( buf) ;
12
13
}
13
14
14
15
macro_rules! benches_for_size {
15
- ( $size: expr, $name1: ident, $name2: ident) => {
16
+ ( $size: expr, $name1: ident, $name2: ident, $name3 : ident , $name4 : ident , $name5 : ident , $name6 : ident ) => {
16
17
#[ bench]
17
18
fn $name1( b: & mut Bencher ) {
18
19
b. bytes = $size as u64 ;
@@ -35,13 +36,106 @@ macro_rules! benches_for_size {
35
36
touch_obj( & mut buf, $size) ;
36
37
} ) ;
37
38
}
39
+
40
+ #[ bench]
41
+ fn $name3( b: & mut Bencher ) {
42
+ b. iter( || run_vec( 10 , 1000 , $size) ) ;
43
+ }
44
+
45
+ #[ bench]
46
+ fn $name4( b: & mut Bencher ) {
47
+ b. iter( || run_vec( 1 , 1000 , $size) ) ;
48
+ }
49
+
50
+ #[ bench]
51
+ fn $name5( b: & mut Bencher ) {
52
+ b. iter( || run_pool( 10 , 1000 , $size) ) ;
53
+ }
54
+
55
+ #[ bench]
56
+ fn $name6( b: & mut Bencher ) {
57
+ b. iter( || run_pool( 1 , 1000 , $size) ) ;
58
+ }
38
59
} ;
39
60
}
40
61
41
- benches_for_size ! ( 256 , base_line_vec_256b, pool_256b) ;
42
- benches_for_size ! ( 1 * 1024 , base_line_vec_1k, pool_1k) ;
43
- benches_for_size ! ( 4 * 1024 , base_line_vec_4k, pool_4k) ;
44
- benches_for_size ! ( 8 * 1024 , base_line_vec_8k, pool_8k) ;
62
+ fn run_pool ( thread : usize , iter : usize , size : usize ) {
63
+ use std:: sync:: Arc ;
64
+ let p = Arc :: new ( BytePool :: new ( ) ) ;
65
+ let mut threads = Vec :: new ( ) ;
66
+
67
+ for _ in 0 ..thread {
68
+ let p = p. clone ( ) ;
69
+ threads. push ( std:: thread:: spawn ( move || {
70
+ for _ in 0 ..iter {
71
+ let mut v = p. alloc ( size) ;
72
+ v[ 0 ] = 1 ;
73
+ v[ size / 4 ] = 1 ;
74
+ v[ size / 2 ] = 1 ;
75
+ }
76
+ } ) ) ;
77
+ }
78
+
79
+ for t in threads {
80
+ t. join ( ) . unwrap ( ) ;
81
+ }
82
+ }
83
+
84
+ fn run_vec ( thread : usize , iter : usize , size : usize ) {
85
+ let mut threads = Vec :: new ( ) ;
86
+
87
+ for _ in 0 ..thread {
88
+ threads. push ( std:: thread:: spawn ( move || {
89
+ for _ in 0 ..iter {
90
+ let mut v = vec ! [ 0u8 ; size] ;
91
+ v[ 0 ] = 1 ;
92
+ v[ size / 4 ] = 1 ;
93
+ v[ size / 2 ] = 1 ;
94
+ }
95
+ } ) ) ;
96
+ }
97
+
98
+ for t in threads {
99
+ t. join ( ) . unwrap ( ) ;
100
+ }
101
+ }
102
+
103
+ benches_for_size ! (
104
+ 256 ,
105
+ vec_256b,
106
+ pool_256b,
107
+ vec_256b_contention,
108
+ vec_256b_no_contention,
109
+ pool_256b_contention,
110
+ pool_256b_no_contention
111
+ ) ;
112
+ benches_for_size ! (
113
+ 1 * 1024 ,
114
+ vec_1k,
115
+ pool_1k,
116
+ vec_1k_contention,
117
+ vec_1k_no_contention,
118
+ pool_1k_contention,
119
+ pool_1k_no_contention
120
+ ) ;
121
+ benches_for_size ! (
122
+ 4 * 1024 ,
123
+ vec_4k,
124
+ pool_4k,
125
+ vec_4k_contention,
126
+ vec_4k_no_contention,
127
+ pool_4k_contention,
128
+ pool_4k_no_contention
129
+ ) ;
130
+ benches_for_size ! (
131
+ 8 * 1024 ,
132
+ vec_8k,
133
+ pool_8k,
134
+ vec_8k_contention,
135
+ vec_8k_no_contention,
136
+ pool_8k_contention,
137
+ pool_8k_no_contention
138
+ ) ;
45
139
46
140
#[ bench]
47
141
fn base_line_vec_mixed ( b : & mut Bencher ) {
0 commit comments