1 use test
::{black_box, Bencher}
;
4 fn char_iterator(b
: &mut Bencher
) {
5 let s
= "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
7 b
.iter(|| s
.chars().count());
11 fn char_iterator_for(b
: &mut Bencher
) {
12 let s
= "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
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";
30 b
.iter(|| s
.chars().count());
34 fn char_iterator_rev(b
: &mut Bencher
) {
35 let s
= "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
37 b
.iter(|| s
.chars().rev().count());
41 fn char_iterator_rev_for(b
: &mut Bencher
) {
42 let s
= "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
45 for ch
in s
.chars().rev() {
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();
56 b
.iter(|| assert_eq
!(s
.char_indices().count(), len
));
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();
64 b
.iter(|| assert_eq
!(s
.char_indices().rev().count(), len
));
68 fn split_unicode_ascii(b
: &mut Bencher
) {
69 let s
= "ประเทศไทย中华Việt Namประเทศไทย中华Việt Nam";
71 b
.iter(|| assert_eq
!(s
.split('V'
).count(), 3));
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();
79 b
.iter(|| assert_eq
!(s
.split(' '
).count(), len
));
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
{
90 b
.iter(|| assert_eq
!(s
.split(pred
).count(), len
));
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();
98 b
.iter(|| assert_eq
!(s
.split(|c
: char| c
== ' '
).count(), len
));
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();
106 let c
: &[char] = &[' '
];
107 b
.iter(|| assert_eq
!(s
.split(c
).count(), len
));
111 fn bench_join(b
: &mut Bencher
) {
112 let s
= "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
114 let v
= vec
![s
, s
, s
, s
, s
, s
, s
, s
, s
, s
];
116 assert_eq
!(v
.join(sep
).len(), s
.len() * 10 + sep
.len() * 9);
121 fn bench_contains_short_short(b
: &mut Bencher
) {
122 let haystack
= "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
126 assert
!(haystack
.contains(needle
));
131 fn bench_contains_short_long(b
: &mut Bencher
) {
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.
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.
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.
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 \
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";
170 assert
!(!haystack
.contains(needle
));
175 fn bench_contains_bad_naive(b
: &mut Bencher
) {
176 let haystack
= "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
177 let needle
= "aaaaaaaab";
180 assert
!(!haystack
.contains(needle
));
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.";
190 assert
!(haystack
.contains(needle
));
194 macro_rules
! make_test_inner
{
195 ($s
:ident
, $code
:expr
, $name
:ident
, $
str:expr
, $iters
:expr
) => {
197 fn $
name(bencher
: &mut Bencher
) {
209 macro_rules
! make_test
{
210 ($name
:ident
, $s
:ident
, $code
:expr
) => {
211 make_test
!($name
, $s
, $code
, 1);
213 ($name
:ident
, $s
:ident
, $code
:expr
, $iters
:expr
) => {
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.
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.
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.
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 \
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
);
264 make_test
!(chars_count
, s
, s
.chars().count());
266 make_test
!(contains_bang_str
, s
, s
.contains("!"));
267 make_test
!(contains_bang_char
, s
, s
.contains('
!'
));
269 make_test
!(match_indices_a_str
, s
, s
.match_indices("a").count());
271 make_test
!(split_a_str
, s
, s
.split("a").count());
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()) }
);
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("_"));
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}"));
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);
292 make_test
!(split_space_char
, s
, s
.split(' '
).count());
293 make_test
!(split_terminator_space_char
, s
, s
.split_terminator(' '
).count());
295 make_test
!(splitn_space_char
, s
, s
.splitn(10, ' '
).count());
296 make_test
!(rsplitn_space_char
, s
, s
.rsplitn(10, ' '
).count());
298 make_test
!(split_space_str
, s
, s
.split(" ").count());
299 make_test
!(split_ad_str
, s
, s
.split("ad").count());