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