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.
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.
11 use test
::{Bencher, black_box}
;
14 fn char_iterator(b
: &mut Bencher
) {
15 let s
= "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
17 b
.iter(|| s
.chars().count());
21 fn char_iterator_for(b
: &mut Bencher
) {
22 let s
= "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
25 for ch
in s
.chars() { black_box(ch); }
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";
38 b
.iter(|| s
.chars().count());
42 fn char_iterator_rev(b
: &mut Bencher
) {
43 let s
= "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
45 b
.iter(|| s
.chars().rev().count());
49 fn char_iterator_rev_for(b
: &mut Bencher
) {
50 let s
= "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
53 for ch
in s
.chars().rev() { black_box(ch); }
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();
62 b
.iter(|| assert_eq
!(s
.char_indices().count(), len
));
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();
70 b
.iter(|| assert_eq
!(s
.char_indices().rev().count(), len
));
74 fn split_unicode_ascii(b
: &mut Bencher
) {
75 let s
= "ประเทศไทย中华Việt Namประเทศไทย中华Việt Nam";
77 b
.iter(|| assert_eq
!(s
.split('V'
).count(), 3));
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();
85 b
.iter(|| assert_eq
!(s
.split(' '
).count(), len
));
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 == ' ' }
94 b
.iter(|| assert_eq
!(s
.split(pred
).count(), len
));
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();
102 b
.iter(|| assert_eq
!(s
.split(|c
: char| c
== ' '
).count(), len
));
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();
110 let c
: &[char] = &[' '
];
111 b
.iter(|| assert_eq
!(s
.split(c
).count(), len
));
115 fn bench_join(b
: &mut Bencher
) {
116 let s
= "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
118 let v
= vec
![s
, s
, s
, s
, s
, s
, s
, s
, s
, s
];
120 assert_eq
!(v
.join(sep
).len(), s
.len() * 10 + sep
.len() * 9);
125 fn bench_contains_short_short(b
: &mut Bencher
) {
126 let haystack
= "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
130 assert
!(haystack
.contains(needle
));
135 fn bench_contains_short_long(b
: &mut Bencher
) {
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.
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.
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.
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 \
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";
174 assert
!(!haystack
.contains(needle
));
179 fn bench_contains_bad_naive(b
: &mut Bencher
) {
180 let haystack
= "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
181 let needle
= "aaaaaaaab";
184 assert
!(!haystack
.contains(needle
));
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.";
194 assert
!(haystack
.contains(needle
));
199 macro_rules
! make_test_inner
{
200 ($s
:ident
, $code
:expr
, $name
:ident
, $
str:expr
, $iters
:expr
) => {
202 fn $
name(bencher
: &mut Bencher
) {
205 bencher
.iter(|| for _
in 0..$iters { black_box($code); }
);
210 macro_rules
! make_test
{
211 ($name
:ident
, $s
:ident
, $code
:expr
) => {
212 make_test
!($name
, $s
, $code
, 1);
214 ($name
:ident
, $s
:ident
, $code
:expr
, $iters
:expr
) => {
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.
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.
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.
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 \
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
);
265 make_test
!(chars_count
, s
, s
.chars().count());
267 make_test
!(contains_bang_str
, s
, s
.contains("!"));
268 make_test
!(contains_bang_char
, s
, s
.contains('
!'
));
270 make_test
!(match_indices_a_str
, s
, s
.match_indices("a").count());
272 make_test
!(split_a_str
, s
, s
.split("a").count());
274 make_test
!(trim_ascii_char
, s
, {
275 use std
::ascii
::AsciiExt
;
276 s
.trim_matches(|c
: char| c
.is_ascii())
278 make_test
!(trim_left_ascii_char
, s
, {
279 use std
::ascii
::AsciiExt
;
280 s
.trim_left_matches(|c
: char| c
.is_ascii())
282 make_test
!(trim_right_ascii_char
, s
, {
283 use std
::ascii
::AsciiExt
;
284 s
.trim_right_matches(|c
: char| c
.is_ascii())
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("_"));
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}"));
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);
302 make_test
!(split_space_char
, s
, s
.split(' '
).count());
303 make_test
!(split_terminator_space_char
, s
, s
.split_terminator(' '
).count());
305 make_test
!(splitn_space_char
, s
, s
.splitn(10, ' '
).count());
306 make_test
!(rsplitn_space_char
, s
, s
.rsplitn(10, ' '
).count());
308 make_test
!(split_space_str
, s
, s
.split(" ").count());
309 make_test
!(split_ad_str
, s
, s
.split("ad").count());