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 |
| lelwel | LL(1) | in source | build script | &str | pratt | No | 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:
| Name | Overhead (release) | Build (debug) | Parse (release) | Downloads | Version |
|---|---|---|---|---|---|
| null | 0 KiB | 164ms | 2ms | - | - |
| grmtools | 2,612 KiB | 10s | 182ms | v0.14.1 | |
| chumsky | 161 KiB | 5s | 47ms | v0.12.0 | |
| combine | 175 KiB | 4s | 53ms | v3.8.1 | |
| lalrpop | 1,523 KiB | 12s | 40ms | v0.23.1 | |
| lelwel | 175 KiB | 7s | 33ms | v0.10.4 | |
| logos | 71 KiB | 6s | 22ms | v0.16.1 | |
| nom | 88 KiB | 3s | 68ms | v8.0.0 | |
| parol | 480 KiB | 9s | 184ms | v4.4.0 | |
| peg | 77 KiB | 2s | 29ms | v0.8.5 | |
| pest | 119 KiB | 3s | 62ms | v2.8.6 | |
| serde_json | 57 KiB | 3s | 18ms | v1.0.149 | |
| winnow | 67 KiB | 1s | 27ms | v1.0.1 | |
| yap | 60 KiB | 420ms | 40ms | v0.12.0 |
System: Linux 6.17.9-76061709-generic (x86_64), rustc 1.94.1 (e408947bf 2026-03-25) w/ -j 8
Note:
$ ./bench.py
$ ./format.py
Python
100.0%
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 |
| lelwel | LL(1) | in source | build script | &str | pratt | No | 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:
| Name | Overhead (release) | Build (debug) | Parse (release) | Downloads | Version |
|---|---|---|---|---|---|
| null | 0 KiB | 164ms | 2ms | - | - |
| grmtools | 2,612 KiB | 10s | 182ms | v0.14.1 | |
| chumsky | 161 KiB | 5s | 47ms | v0.12.0 | |
| combine | 175 KiB | 4s | 53ms | v3.8.1 | |
| lalrpop | 1,523 KiB | 12s | 40ms | v0.23.1 | |
| lelwel | 175 KiB | 7s | 33ms | v0.10.4 | |
| logos | 71 KiB | 6s | 22ms | v0.16.1 | |
| nom | 88 KiB | 3s | 68ms | v8.0.0 | |
| parol | 480 KiB | 9s | 184ms | v4.4.0 | |
| peg | 77 KiB | 2s | 29ms | v0.8.5 | |
| pest | 119 KiB | 3s | 62ms | v2.8.6 | |
| serde_json | 57 KiB | 3s | 18ms | v1.0.149 | |
| winnow | 67 KiB | 1s | 27ms | v1.0.1 | |
| yap | 60 KiB | 420ms | 40ms | v0.12.0 |
System: Linux 6.17.9-76061709-generic (x86_64), rustc 1.94.1 (e408947bf 2026-03-25) w/ -j 8
Note:
$ ./bench.py
$ ./format.py
Python
100.0%