• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //! # Performance
2 //!
3 //! ## Runtime Performance
4 //!
5 //! See also the general Rust [Performance Book](https://nnethercote.github.io/perf-book/)
6 //!
7 //! Tips
8 //! - Try `cargo add winnow -F simd`. For some it offers significant performance improvements
9 //! - When enough cases of an [`alt`] have unique prefixes, prefer [`dispatch`]
10 //! - When parsing text, try to parse as bytes (`u8`) rather than `char`s ([`BStr`] can make
11 //!   debugging easier)
12 //! - Find simplified subsets of the grammar to parse, falling back to the full grammar when it
13 //!   doesn't work. For example, when parsing json strings, parse them without support for escapes,
14 //!   falling back to escape support if it fails.
15 //! - Watch for large return types. A surprising place these can show up is when chaining parsers
16 //!   with a tuple.
17 //!
18 //! ## Build-time Performance
19 //!
20 //! Returning complex types as `impl Trait` can negatively impact build times. This can hit in
21 //! surprising cases like:
22 //! ```rust
23 //! # use winnow::prelude::*;
24 //! fn foo<I, O, E>() -> impl Parser<I, O, E>
25 //! # where
26 //! #    I: winnow::stream::Stream<Token=O>,
27 //! #    I: winnow::stream::StreamIsPartial,
28 //! #    E: winnow::error::ParserError<I>,
29 //! {
30 //!     // ...some chained combinators...
31 //! # winnow::token::any
32 //! }
33 //! ```
34 //!
35 //! Instead, wrap the combinators in a closure to simplify the type:
36 //! ```rust
37 //! # use winnow::prelude::*;
38 //! fn foo<I, O, E>() -> impl Parser<I, O, E>
39 //! # where
40 //! #    I: winnow::stream::Stream<Token=O>,
41 //! #    I: winnow::stream::StreamIsPartial,
42 //! #    E: winnow::error::ParserError<I>,
43 //! {
44 //!     move |input: &mut I| {
45 //!         // ...some chained combinators...
46 //! # winnow::token::any
47 //!             .parse_next(input)
48 //!     }
49 //! }
50 //! ```
51 
52 #![allow(unused_imports)]
53 use crate::combinator::alt;
54 use crate::combinator::dispatch;
55 use crate::stream::BStr;
56