use std::rand::{Rng, thread_rng};
use stdtest::Bencher;
+use std::iter::repeat;
use regex::{Regex, NoExpand};
fn no_exponential(b: &mut Bencher) {
let n = 100;
let re = Regex::new(format!("{}{}",
- "a?".repeat(n),
- "a".repeat(n)).as_slice()).unwrap();
- let text = "a".repeat(n);
+ repeat("a?").take(n).collect::<String>(),
+ repeat("a").take(n).collect::<String>()).as_slice()).unwrap();
+ let text = repeat("a").take(n).collect::<String>();
bench_assert_match(b, re, text.as_slice());
}
#[bench]
fn literal(b: &mut Bencher) {
let re = regex!("y");
- let text = format!("{}y", "x".repeat(50));
+ let text = format!("{}y", repeat("x").take(50).collect::<String>());
bench_assert_match(b, re, text.as_slice());
}
#[bench]
fn not_literal(b: &mut Bencher) {
let re = regex!(".y");
- let text = format!("{}y", "x".repeat(50));
+ let text = format!("{}y", repeat("x").take(50).collect::<String>());
bench_assert_match(b, re, text.as_slice());
}
#[bench]
fn match_class(b: &mut Bencher) {
let re = regex!("[abcdw]");
- let text = format!("{}w", "xxxx".repeat(20));
+ let text = format!("{}w", repeat("xxxx").take(20).collect::<String>());
bench_assert_match(b, re, text.as_slice());
}
fn match_class_in_range(b: &mut Bencher) {
// 'b' is between 'a' and 'c', so the class range checking doesn't help.
let re = regex!("[ac]");
- let text = format!("{}c", "bbbb".repeat(20));
+ let text = format!("{}c", repeat("bbbb").take(20).collect::<String>());
bench_assert_match(b, re, text.as_slice());
}
#[bench]
fn anchored_literal_long_non_match(b: &mut Bencher) {
let re = regex!("^zbc(d|e)");
- let text = "abcdefghijklmnopqrstuvwxyz".repeat(15);
+ let text = repeat("abcdefghijklmnopqrstuvwxyz").take(15).collect::<String>();
b.iter(|| re.is_match(text.as_slice()));
}
#[bench]
fn anchored_literal_long_match(b: &mut Bencher) {
let re = regex!("^.bc(d|e)");
- let text = "abcdefghijklmnopqrstuvwxyz".repeat(15);
+ let text = repeat("abcdefghijklmnopqrstuvwxyz").take(15).collect::<String>();
b.iter(|| re.is_match(text.as_slice()));
}