From e0fcc90d423b017e4e20a1b752d3be86982e29c6 Mon Sep 17 00:00:00 2001 From: Anupam Jain Date: Fri, 24 Jul 2015 06:02:10 +0530 Subject: [PATCH] Checked in benchmark image from https://github.com/philopon/apiary-benchmark --- README.md | 10 ++++++++++ benchmark/result-tama.png | Bin 0 -> 18193 bytes 2 files changed, 10 insertions(+) create mode 100644 benchmark/result-tama.png diff --git a/README.md b/README.md index 4e291a4..067ccaf 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,16 @@ The following features are planned for later releases - - Tests and code coverage +Performance +=========== + +When it comes to performance, Wai-routes compares quite favorably with other Haskell web development micro frameworks. + +See more details here - [philopon/apiary-benchmark](https://github.com/philopon/apiary-benchmark) + +![result](./benchmark/result-tama.png) + + Example Usage ============= diff --git a/benchmark/result-tama.png b/benchmark/result-tama.png new file mode 100644 index 0000000000000000000000000000000000000000..0f1f78033a8bdecadb2dbca16d46604ad899451b GIT binary patch literal 18193 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 LI36pjbNl}Qh>776 literal 0 HcmV?d00001