This repo tries to assess Rust parsing performance.
| crate | parser type | action code | integration | input type | precedence | parameterized rules | streaming input |
|---|---|---|---|---|---|---|---|
| chumsky | combinators | in source | library | &str, &[u8], custom |
pratt | Yes | Yes |
| combine | combinators | in source | library | &str |
? | ? | ? |
| grmtools | CFG | in grammar | library | ? | ? | ? | ? |
| lalrpop | LR(1) | in grammar | build script | &str |
none | Yes | No |
| logos | lexer | in source | proc macro | &str, &[u8] |
? | ? | ? |
| nom | combinators | in source | library | &str, &[u8], custom |
pratt | Yes | Yes |
| parol | LL(k)/LALR(1) | in source | build script | &str |
climbing | No | No |
| peg | PEG | in grammar | proc macro (block) | &str, &[T], custom |
climbing | Yes | No |
| pest | PEG | external | proc macro (file) | &str |
climbing | No | No |
| winnow | combinators | in source | library | &str, &[T], custom |
none | Yes | Yes |
| yap | combinators | in source | library | &str, &[T], custom |
none | Yes | ? |
Formerly, we compared:
System: Linux 6.8.0-62-generic (x86_64), rustc 1.89.0 (29483883e 2025-08-04) w/ -j 8
Note:
- For more "Parse (release)" comparisons, see parser_benchmarks
- Parsers have not been validated and might have differing levels of quality (#5)
$ ./bench.py
$ ./format.py