]> git.proxmox.com Git - rustc.git/blob - src/liballoc/benches/str.rs
New upstream version 1.20.0+dfsg1
[rustc.git] / src / liballoc / benches / str.rs
1 // Copyright 2017 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 use test::{Bencher, black_box};
12
13 #[bench]
14 fn char_iterator(b: &mut Bencher) {
15 let s = "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
16
17 b.iter(|| s.chars().count());
18 }
19
20 #[bench]
21 fn char_iterator_for(b: &mut Bencher) {
22 let s = "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
23
24 b.iter(|| {
25 for ch in s.chars() { black_box(ch); }
26 });
27 }
28
29 #[bench]
30 fn char_iterator_ascii(b: &mut Bencher) {
31 let s = "Mary had a little lamb, Little lamb
32 Mary had a little lamb, Little lamb
33 Mary had a little lamb, Little lamb
34 Mary had a little lamb, Little lamb
35 Mary had a little lamb, Little lamb
36 Mary had a little lamb, Little lamb";
37
38 b.iter(|| s.chars().count());
39 }
40
41 #[bench]
42 fn char_iterator_rev(b: &mut Bencher) {
43 let s = "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
44
45 b.iter(|| s.chars().rev().count());
46 }
47
48 #[bench]
49 fn char_iterator_rev_for(b: &mut Bencher) {
50 let s = "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
51
52 b.iter(|| {
53 for ch in s.chars().rev() { black_box(ch); }
54 });
55 }
56
57 #[bench]
58 fn char_indicesator(b: &mut Bencher) {
59 let s = "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
60 let len = s.chars().count();
61
62 b.iter(|| assert_eq!(s.char_indices().count(), len));
63 }
64
65 #[bench]
66 fn char_indicesator_rev(b: &mut Bencher) {
67 let s = "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
68 let len = s.chars().count();
69
70 b.iter(|| assert_eq!(s.char_indices().rev().count(), len));
71 }
72
73 #[bench]
74 fn split_unicode_ascii(b: &mut Bencher) {
75 let s = "ประเทศไทย中华Việt Namประเทศไทย中华Việt Nam";
76
77 b.iter(|| assert_eq!(s.split('V').count(), 3));
78 }
79
80 #[bench]
81 fn split_ascii(b: &mut Bencher) {
82 let s = "Mary had a little lamb, Little lamb, little-lamb.";
83 let len = s.split(' ').count();
84
85 b.iter(|| assert_eq!(s.split(' ').count(), len));
86 }
87
88 #[bench]
89 fn split_extern_fn(b: &mut Bencher) {
90 let s = "Mary had a little lamb, Little lamb, little-lamb.";
91 let len = s.split(' ').count();
92 fn pred(c: char) -> bool { c == ' ' }
93
94 b.iter(|| assert_eq!(s.split(pred).count(), len));
95 }
96
97 #[bench]
98 fn split_closure(b: &mut Bencher) {
99 let s = "Mary had a little lamb, Little lamb, little-lamb.";
100 let len = s.split(' ').count();
101
102 b.iter(|| assert_eq!(s.split(|c: char| c == ' ').count(), len));
103 }
104
105 #[bench]
106 fn split_slice(b: &mut Bencher) {
107 let s = "Mary had a little lamb, Little lamb, little-lamb.";
108 let len = s.split(' ').count();
109
110 let c: &[char] = &[' '];
111 b.iter(|| assert_eq!(s.split(c).count(), len));
112 }
113
114 #[bench]
115 fn bench_join(b: &mut Bencher) {
116 let s = "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
117 let sep = "→";
118 let v = vec![s, s, s, s, s, s, s, s, s, s];
119 b.iter(|| {
120 assert_eq!(v.join(sep).len(), s.len() * 10 + sep.len() * 9);
121 })
122 }
123
124 #[bench]
125 fn bench_contains_short_short(b: &mut Bencher) {
126 let haystack = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
127 let needle = "sit";
128
129 b.iter(|| {
130 assert!(haystack.contains(needle));
131 })
132 }
133
134 #[bench]
135 fn bench_contains_short_long(b: &mut Bencher) {
136 let haystack = "\
137 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse quis lorem sit amet dolor \
138 ultricies condimentum. Praesent iaculis purus elit, ac malesuada quam malesuada in. Duis sed orci \
139 eros. Suspendisse sit amet magna mollis, mollis nunc luctus, imperdiet mi. Integer fringilla non \
140 sem ut lacinia. Fusce varius tortor a risus porttitor hendrerit. Morbi mauris dui, ultricies nec \
141 tempus vel, gravida nec quam.
142
143 In est dui, tincidunt sed tempus interdum, adipiscing laoreet ante. Etiam tempor, tellus quis \
144 sagittis interdum, nulla purus mattis sem, quis auctor erat odio ac tellus. In nec nunc sit amet \
145 diam volutpat molestie at sed ipsum. Vestibulum laoreet consequat vulputate. Integer accumsan \
146 lorem ac dignissim placerat. Suspendisse convallis faucibus lorem. Aliquam erat volutpat. In vel \
147 eleifend felis. Sed suscipit nulla lorem, sed mollis est sollicitudin et. Nam fermentum egestas \
148 interdum. Curabitur ut nisi justo.
149
150 Sed sollicitudin ipsum tellus, ut condimentum leo eleifend nec. Cras ut velit ante. Phasellus nec \
151 mollis odio. Mauris molestie erat in arcu mattis, at aliquet dolor vehicula. Quisque malesuada \
152 lectus sit amet nisi pretium, a condimentum ipsum porta. Morbi at dapibus diam. Praesent egestas \
153 est sed risus elementum, eu rutrum metus ultrices. Etiam fermentum consectetur magna, id rutrum \
154 felis accumsan a. Aliquam ut pellentesque libero. Sed mi nulla, lobortis eu tortor id, suscipit \
155 ultricies neque. Morbi iaculis sit amet risus at iaculis. Praesent eget ligula quis turpis \
156 feugiat suscipit vel non arcu. Interdum et malesuada fames ac ante ipsum primis in faucibus. \
157 Aliquam sit amet placerat lorem.
158
159 Cras a lacus vel ante posuere elementum. Nunc est leo, bibendum ut facilisis vel, bibendum at \
160 mauris. Nullam adipiscing diam vel odio ornare, luctus adipiscing mi luctus. Nulla facilisi. \
161 Mauris adipiscing bibendum neque, quis adipiscing lectus tempus et. Sed feugiat erat et nisl \
162 lobortis pharetra. Donec vitae erat enim. Nullam sit amet felis et quam lacinia tincidunt. Aliquam \
163 suscipit dapibus urna. Sed volutpat urna in magna pulvinar volutpat. Phasellus nec tellus ac diam \
164 cursus accumsan.
165
166 Nam lectus enim, dapibus non nisi tempor, consectetur convallis massa. Maecenas eleifend dictum \
167 feugiat. Etiam quis mauris vel risus luctus mattis a a nunc. Nullam orci quam, imperdiet id \
168 vehicula in, porttitor ut nibh. Duis sagittis adipiscing nisl vitae congue. Donec mollis risus eu \
169 leo suscipit, varius porttitor nulla porta. Pellentesque ut sem nec nisi euismod vehicula. Nulla \
170 malesuada sollicitudin quam eu fermentum.";
171 let needle = "english";
172
173 b.iter(|| {
174 assert!(!haystack.contains(needle));
175 })
176 }
177
178 #[bench]
179 fn bench_contains_bad_naive(b: &mut Bencher) {
180 let haystack = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
181 let needle = "aaaaaaaab";
182
183 b.iter(|| {
184 assert!(!haystack.contains(needle));
185 })
186 }
187
188 #[bench]
189 fn bench_contains_equal(b: &mut Bencher) {
190 let haystack = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
191 let needle = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
192
193 b.iter(|| {
194 assert!(haystack.contains(needle));
195 })
196 }
197
198
199 macro_rules! make_test_inner {
200 ($s:ident, $code:expr, $name:ident, $str:expr, $iters:expr) => {
201 #[bench]
202 fn $name(bencher: &mut Bencher) {
203 let mut $s = $str;
204 black_box(&mut $s);
205 bencher.iter(|| for _ in 0..$iters { black_box($code); });
206 }
207 }
208 }
209
210 macro_rules! make_test {
211 ($name:ident, $s:ident, $code:expr) => {
212 make_test!($name, $s, $code, 1);
213 };
214 ($name:ident, $s:ident, $code:expr, $iters:expr) => {
215 mod $name {
216 use test::Bencher;
217 use test::black_box;
218
219 // Short strings: 65 bytes each
220 make_test_inner!($s, $code, short_ascii,
221 "Mary had a little lamb, Little lamb Mary had a littl lamb, lamb!", $iters);
222 make_test_inner!($s, $code, short_mixed,
223 "ศไทย中华Việt Nam; Mary had a little lamb, Little lam!", $iters);
224 make_test_inner!($s, $code, short_pile_of_poo,
225 "💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩!", $iters);
226 make_test_inner!($s, $code, long_lorem_ipsum,"\
227 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse quis lorem sit amet dolor \
228 ultricies condimentum. Praesent iaculis purus elit, ac malesuada quam malesuada in. Duis sed orci \
229 eros. Suspendisse sit amet magna mollis, mollis nunc luctus, imperdiet mi. Integer fringilla non \
230 sem ut lacinia. Fusce varius tortor a risus porttitor hendrerit. Morbi mauris dui, ultricies nec \
231 tempus vel, gravida nec quam.
232
233 In est dui, tincidunt sed tempus interdum, adipiscing laoreet ante. Etiam tempor, tellus quis \
234 sagittis interdum, nulla purus mattis sem, quis auctor erat odio ac tellus. In nec nunc sit amet \
235 diam volutpat molestie at sed ipsum. Vestibulum laoreet consequat vulputate. Integer accumsan \
236 lorem ac dignissim placerat. Suspendisse convallis faucibus lorem. Aliquam erat volutpat. In vel \
237 eleifend felis. Sed suscipit nulla lorem, sed mollis est sollicitudin et. Nam fermentum egestas \
238 interdum. Curabitur ut nisi justo.
239
240 Sed sollicitudin ipsum tellus, ut condimentum leo eleifend nec. Cras ut velit ante. Phasellus nec \
241 mollis odio. Mauris molestie erat in arcu mattis, at aliquet dolor vehicula. Quisque malesuada \
242 lectus sit amet nisi pretium, a condimentum ipsum porta. Morbi at dapibus diam. Praesent egestas \
243 est sed risus elementum, eu rutrum metus ultrices. Etiam fermentum consectetur magna, id rutrum \
244 felis accumsan a. Aliquam ut pellentesque libero. Sed mi nulla, lobortis eu tortor id, suscipit \
245 ultricies neque. Morbi iaculis sit amet risus at iaculis. Praesent eget ligula quis turpis \
246 feugiat suscipit vel non arcu. Interdum et malesuada fames ac ante ipsum primis in faucibus. \
247 Aliquam sit amet placerat lorem.
248
249 Cras a lacus vel ante posuere elementum. Nunc est leo, bibendum ut facilisis vel, bibendum at \
250 mauris. Nullam adipiscing diam vel odio ornare, luctus adipiscing mi luctus. Nulla facilisi. \
251 Mauris adipiscing bibendum neque, quis adipiscing lectus tempus et. Sed feugiat erat et nisl \
252 lobortis pharetra. Donec vitae erat enim. Nullam sit amet felis et quam lacinia tincidunt. Aliquam \
253 suscipit dapibus urna. Sed volutpat urna in magna pulvinar volutpat. Phasellus nec tellus ac diam \
254 cursus accumsan.
255
256 Nam lectus enim, dapibus non nisi tempor, consectetur convallis massa. Maecenas eleifend dictum \
257 feugiat. Etiam quis mauris vel risus luctus mattis a a nunc. Nullam orci quam, imperdiet id \
258 vehicula in, porttitor ut nibh. Duis sagittis adipiscing nisl vitae congue. Donec mollis risus eu \
259 leo suscipit, varius porttitor nulla porta. Pellentesque ut sem nec nisi euismod vehicula. Nulla \
260 malesuada sollicitudin quam eu fermentum!", $iters);
261 }
262 }
263 }
264
265 make_test!(chars_count, s, s.chars().count());
266
267 make_test!(contains_bang_str, s, s.contains("!"));
268 make_test!(contains_bang_char, s, s.contains('!'));
269
270 make_test!(match_indices_a_str, s, s.match_indices("a").count());
271
272 make_test!(split_a_str, s, s.split("a").count());
273
274 make_test!(trim_ascii_char, s, {
275 use std::ascii::AsciiExt;
276 s.trim_matches(|c: char| c.is_ascii())
277 });
278 make_test!(trim_left_ascii_char, s, {
279 use std::ascii::AsciiExt;
280 s.trim_left_matches(|c: char| c.is_ascii())
281 });
282 make_test!(trim_right_ascii_char, s, {
283 use std::ascii::AsciiExt;
284 s.trim_right_matches(|c: char| c.is_ascii())
285 });
286
287 make_test!(find_underscore_char, s, s.find('_'));
288 make_test!(rfind_underscore_char, s, s.rfind('_'));
289 make_test!(find_underscore_str, s, s.find("_"));
290
291 make_test!(find_zzz_char, s, s.find('\u{1F4A4}'));
292 make_test!(rfind_zzz_char, s, s.rfind('\u{1F4A4}'));
293 make_test!(find_zzz_str, s, s.find("\u{1F4A4}"));
294
295 make_test!(starts_with_ascii_char, s, s.starts_with('/'), 1024);
296 make_test!(ends_with_ascii_char, s, s.ends_with('/'), 1024);
297 make_test!(starts_with_unichar, s, s.starts_with('\u{1F4A4}'), 1024);
298 make_test!(ends_with_unichar, s, s.ends_with('\u{1F4A4}'), 1024);
299 make_test!(starts_with_str, s, s.starts_with("💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩"), 1024);
300 make_test!(ends_with_str, s, s.ends_with("💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩"), 1024);
301
302 make_test!(split_space_char, s, s.split(' ').count());
303 make_test!(split_terminator_space_char, s, s.split_terminator(' ').count());
304
305 make_test!(splitn_space_char, s, s.splitn(10, ' ').count());
306 make_test!(rsplitn_space_char, s, s.rsplitn(10, ' ').count());
307
308 make_test!(split_space_str, s, s.split(" ").count());
309 make_test!(split_ad_str, s, s.split("ad").count());