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