mirror of
https://github.com/RustPython/RustPython.git
synced 2026-06-02 19:39:49 +09:00
add benchmark
This commit is contained in:
112
benches/benches.rs
Normal file
112
benches/benches.rs
Normal file
@@ -0,0 +1,112 @@
|
||||
#![feature(test)]
|
||||
|
||||
extern crate test;
|
||||
use test::Bencher;
|
||||
|
||||
use sre_engine::constants::SreFlag;
|
||||
use sre_engine::engine;
|
||||
pub struct Pattern {
|
||||
pub code: &'static [u32],
|
||||
pub flags: SreFlag,
|
||||
}
|
||||
|
||||
impl Pattern {
|
||||
pub fn state<'a>(
|
||||
&self,
|
||||
string: impl Into<engine::StrDrive<'a>>,
|
||||
range: std::ops::Range<usize>,
|
||||
) -> engine::State<'a> {
|
||||
engine::State::new(string.into(), range.start, range.end, self.flags, self.code)
|
||||
}
|
||||
}
|
||||
#[bench]
|
||||
fn benchmarks(b: &mut Bencher) {
|
||||
// # test common prefix
|
||||
// pattern p1 = re.compile('Python|Perl') # , 'Perl'), # Alternation
|
||||
// START GENERATED by generate_tests.py
|
||||
#[rustfmt::skip] let p1 = Pattern { code: &[15, 8, 1, 4, 6, 1, 1, 80, 0, 17, 80, 7, 13, 17, 121, 17, 116, 17, 104, 17, 111, 17, 110, 16, 11, 9, 17, 101, 17, 114, 17, 108, 16, 2, 0, 1], flags: SreFlag::from_bits_truncate(32) };
|
||||
// END GENERATED
|
||||
// pattern p2 = re.compile('(Python|Perl)') #, 'Perl'), # Grouped alternation
|
||||
// START GENERATED by generate_tests.py
|
||||
#[rustfmt::skip] let p2 = Pattern { code: &[15, 8, 1, 4, 6, 1, 0, 80, 0, 18, 0, 17, 80, 7, 13, 17, 121, 17, 116, 17, 104, 17, 111, 17, 110, 16, 11, 9, 17, 101, 17, 114, 17, 108, 16, 2, 0, 18, 1, 1], flags: SreFlag::from_bits_truncate(32) };
|
||||
// END GENERATED
|
||||
// pattern pn = re.compile('Python|Perl|Tcl') #, 'Perl'), # Alternation
|
||||
// START GENERATED by generate_tests.py
|
||||
#[rustfmt::skip] let p3 = Pattern { code: &[15, 9, 4, 3, 6, 17, 80, 17, 84, 0, 7, 15, 17, 80, 17, 121, 17, 116, 17, 104, 17, 111, 17, 110, 16, 22, 11, 17, 80, 17, 101, 17, 114, 17, 108, 16, 11, 9, 17, 84, 17, 99, 17, 108, 16, 2, 0, 1], flags: SreFlag::from_bits_truncate(32) };
|
||||
// END GENERATED
|
||||
// pattern pn = re.compile('(Python|Perl|Tcl)') #, 'Perl'), # Grouped alternation
|
||||
// START GENERATED by generate_tests.py
|
||||
#[rustfmt::skip] let p4 = Pattern { code: &[15, 9, 4, 3, 6, 17, 80, 17, 84, 0, 18, 0, 7, 15, 17, 80, 17, 121, 17, 116, 17, 104, 17, 111, 17, 110, 16, 22, 11, 17, 80, 17, 101, 17, 114, 17, 108, 16, 11, 9, 17, 84, 17, 99, 17, 108, 16, 2, 0, 18, 1, 1], flags: SreFlag::from_bits_truncate(32) };
|
||||
// END GENERATED
|
||||
// pattern pn = re.compile('(Python)\\1') #, 'PythonPython'), # Backreference
|
||||
// START GENERATED by generate_tests.py
|
||||
#[rustfmt::skip] let p5 = Pattern { code: &[15, 18, 1, 12, 12, 6, 0, 80, 121, 116, 104, 111, 110, 0, 0, 0, 0, 0, 0, 18, 0, 17, 80, 17, 121, 17, 116, 17, 104, 17, 111, 17, 110, 18, 1, 12, 0, 1], flags: SreFlag::from_bits_truncate(32) };
|
||||
// END GENERATED
|
||||
// pattern pn = re.compile('([0a-z][a-z0-9]*,)+') #, 'a5,b7,c9,'), # Disable the fastmap optimization
|
||||
// START GENERATED by generate_tests.py
|
||||
#[rustfmt::skip] let p6 = Pattern { code: &[15, 4, 0, 2, 4294967295, 24, 31, 1, 4294967295, 18, 0, 14, 7, 17, 48, 23, 97, 122, 0, 25, 13, 0, 4294967295, 14, 8, 23, 97, 122, 23, 48, 57, 0, 1, 17, 44, 18, 1, 19, 1], flags: SreFlag::from_bits_truncate(32) };
|
||||
// END GENERATED
|
||||
// pattern pn = re.compile('([a-z][a-z0-9]*,)+') #, 'a5,b7,c9,'), # A few sets
|
||||
// START GENERATED by generate_tests.py
|
||||
#[rustfmt::skip] let p7 = Pattern { code: &[15, 4, 0, 2, 4294967295, 24, 29, 1, 4294967295, 18, 0, 14, 5, 23, 97, 122, 0, 25, 13, 0, 4294967295, 14, 8, 23, 97, 122, 23, 48, 57, 0, 1, 17, 44, 18, 1, 19, 1], flags: SreFlag::from_bits_truncate(32) };
|
||||
// END GENERATED
|
||||
// pattern pn = re.compile('Python') #, 'Python'), # Simple text literal
|
||||
// START GENERATED by generate_tests.py
|
||||
#[rustfmt::skip] let p8 = Pattern { code: &[15, 18, 3, 6, 6, 6, 6, 80, 121, 116, 104, 111, 110, 0, 0, 0, 0, 0, 0, 17, 80, 17, 121, 17, 116, 17, 104, 17, 111, 17, 110, 1], flags: SreFlag::from_bits_truncate(32) };
|
||||
// END GENERATED
|
||||
// pattern pn = re.compile('.*Python') #, 'Python'), # Bad text literal
|
||||
// START GENERATED by generate_tests.py
|
||||
#[rustfmt::skip] let p9 = Pattern { code: &[15, 4, 0, 6, 4294967295, 25, 5, 0, 4294967295, 2, 1, 17, 80, 17, 121, 17, 116, 17, 104, 17, 111, 17, 110, 1], flags: SreFlag::from_bits_truncate(32) };
|
||||
// END GENERATED
|
||||
// pattern pn = re.compile('.*Python.*') #, 'Python'), # Worse text literal
|
||||
// START GENERATED by generate_tests.py
|
||||
#[rustfmt::skip] let p10 = Pattern { code: &[15, 4, 0, 6, 4294967295, 25, 5, 0, 4294967295, 2, 1, 17, 80, 17, 121, 17, 116, 17, 104, 17, 111, 17, 110, 25, 5, 0, 4294967295, 2, 1, 1], flags: SreFlag::from_bits_truncate(32) };
|
||||
// END GENERATED
|
||||
// pattern pn = re.compile('.*(Python)') #, 'Python'), # Bad text literal with grouping
|
||||
// START GENERATED by generate_tests.py
|
||||
#[rustfmt::skip] let p11 = Pattern { code: &[15, 4, 0, 6, 4294967295, 25, 5, 0, 4294967295, 2, 1, 18, 0, 17, 80, 17, 121, 17, 116, 17, 104, 17, 111, 17, 110, 18, 1, 1], flags: SreFlag::from_bits_truncate(32) };
|
||||
// END GENERATED
|
||||
|
||||
let tests = [
|
||||
(p1, "Perl"),
|
||||
(p2, "Perl"),
|
||||
(p3, "Perl"),
|
||||
(p4, "Perl"),
|
||||
(p5, "PythonPython"),
|
||||
(p6, "a5,b7,c9,"),
|
||||
(p7, "a5,b7,c9,"),
|
||||
(p8, "Python"),
|
||||
(p9, "Python"),
|
||||
(p10, "Python"),
|
||||
(p11, "Python"),
|
||||
];
|
||||
|
||||
b.iter(move || {
|
||||
for (p, s) in &tests {
|
||||
let mut state = p.state(s.clone(), 0..usize::MAX);
|
||||
state = state.search();
|
||||
assert!(state.has_matched);
|
||||
state = p.state(s.clone(), 0..usize::MAX);
|
||||
state = state.pymatch();
|
||||
assert!(state.has_matched);
|
||||
state = p.state(s.clone(), 0..usize::MAX);
|
||||
state.match_all = true;
|
||||
state = state.pymatch();
|
||||
assert!(state.has_matched);
|
||||
let s2 = format!("{}{}{}", " ".repeat(10000), s, " ".repeat(10000));
|
||||
state = p.state(s2.as_str(), 0..usize::MAX);
|
||||
state = state.search();
|
||||
assert!(state.has_matched);
|
||||
state = p.state(s2.as_str(), 10000..usize::MAX);
|
||||
state = state.pymatch();
|
||||
assert!(state.has_matched);
|
||||
state = p.state(s2.as_str(), 10000..10000 + s.len());
|
||||
state = state.pymatch();
|
||||
assert!(state.has_matched);
|
||||
state = p.state(s2.as_str(), 10000..10000 + s.len());
|
||||
state.match_all = true;
|
||||
state = state.pymatch();
|
||||
assert!(state.has_matched);
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -5,6 +5,7 @@ import sre_constants
|
||||
import sre_compile
|
||||
import sre_parse
|
||||
import json
|
||||
from itertools import chain
|
||||
|
||||
m = re.search(r"const SRE_MAGIC: usize = (\d+);", open("src/constants.rs").read())
|
||||
sre_engine_magic = int(m.group(1))
|
||||
@@ -38,8 +39,8 @@ def replace_compiled(m):
|
||||
{indent}#[rustfmt::skip] let {varname} = {pattern};
|
||||
{indent}// END GENERATED'''
|
||||
|
||||
with os.scandir("tests") as d:
|
||||
for f in d:
|
||||
with os.scandir("tests") as t, os.scandir("benches") as b:
|
||||
for f in chain(t, b):
|
||||
path = Path(f.path)
|
||||
if path.suffix == ".rs":
|
||||
replaced = pattern_pattern.sub(replace_compiled, path.read_text())
|
||||
|
||||
Reference in New Issue
Block a user