From e4fbfc9bcc8a9df80f8043d6a0ab554ec6d0ffa0 Mon Sep 17 00:00:00 2001 From: Erez Shinan Date: Thu, 2 Nov 2017 16:04:41 +0200 Subject: [PATCH] README even better? --- README.md | 13 +++++++------ docs/comparison_memory.png | Bin 0 -> 24733 bytes docs/comparison_runtime.png | Bin 0 -> 20891 bytes 3 files changed, 7 insertions(+), 6 deletions(-) create mode 100644 docs/comparison_memory.png create mode 100644 docs/comparison_runtime.png diff --git a/README.md b/README.md index 79f6a7e..6622eb9 100644 --- a/README.md +++ b/README.md @@ -86,15 +86,16 @@ See the full list of [features in the wiki](https://github.com/erezsh/lark/wiki/ #### Performance comparison -| Code | CPython Time | PyPy Time | CPython Mem | PyPy Mem -|:-----|:-------------|:------------|:----------|:--------- -| **Lark - LALR(1)** | 4.7s | 1.2s | 70M | 134M | -| PyParsing | 32s | 3.5s | 443M | 225M | -| funcparserlib | 8.5s | 1.3s | 483M | 293M | -| Parsimonious | | 5.7s | | 1545M | +Lower is better! + +![Run-time Comparison](docs/comparison_runtime.png) + +![Memory Usage Comparison](docs/comparison_memory.png) + Check out the [JSON tutorial](/docs/json_tutorial.md#conclusion) for more details on how the comparison was made. +*Note: I really wanted to add PLY to the benchmark, but I couldn't find a working JSON parser anywhere written in PLY. If anyone can point me to one that actually works, I would be happy to add it!* #### Feature comparison diff --git a/docs/comparison_memory.png b/docs/comparison_memory.png new file mode 100644 index 0000000000000000000000000000000000000000..f4f76bca2a68491a1fca3792f66627314c9b7454 GIT binary patch literal 24733 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 F{|Dh+k*NRx literal 0 HcmV?d00001 diff --git a/docs/comparison_runtime.png b/docs/comparison_runtime.png new file mode 100644 index 0000000000000000000000000000000000000000..0784c0e56509407daf7d35fe9d5a9a774a3d5fb9 GIT binary patch literal 20891 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 HoD!M<5EOyk literal 0 HcmV?d00001