From 003d06741f31d98c3343b5f29d34ecf1846fccf7 Mon Sep 17 00:00:00 2001 From: Author Date: Wed, 6 Nov 2024 20:55:56 +0000 Subject: [PATCH] [ci skip] update performance results in README.md --- README.md | 48 +++++++++++++++++++++--------------------- files/p95_cached.png | Bin 0 -> 6756 bytes files/p95_default.png | Bin 0 -> 7243 bytes files/rps_cached.png | Bin 0 -> 6339 bytes files/rps_default.png | Bin 6543 -> 7054 bytes 5 files changed, 24 insertions(+), 24 deletions(-) create mode 100644 files/p95_cached.png create mode 100644 files/p95_default.png create mode 100644 files/rps_cached.png diff --git a/README.md b/README.md index 9c7b071..6025916 100644 --- a/README.md +++ b/README.md @@ -18,42 +18,42 @@ Explore and compare the performance of the fastest GraphQL federation routers th ### [Small Payload - 362 bytes](./source/small.json) | Server | Status | RPS | Latency | | ---: | ---: | ---: | ---: | -| [Nginx](https://nginx.org/en/) | ✅ | `12,075 RPS` | `0.0091 sec` | +| [Nginx](https://nginx.org/en/) | ✅ | `4,872 RPS` | `0.0179 sec` | | **Base** | | | | -| [Tailcall](https://github.com/tailcallhq/tailcall) | ✅ | `17,083 RPS` | `0.0047 sec` | -| [Grafbase](https://github.com/grafbase/grafbase) | ✅ | `9,978 RPS` | `0.0075 sec` | -| [Wundegraph](https://github.com/wundergraph/cosmo) | ✅ | `6,927 RPS` | `0.0132 sec` | -| [Apollo](https://github.com/apollographql/router) | ✅ | `4,553 RPS` | `0.0161 sec` | +| [Tailcall](https://github.com/tailcallhq/tailcall) | ✅ | `8,138 RPS` | `0.0093 sec` | +| [Grafbase](https://github.com/grafbase/grafbase) | ✅ | `5,003 RPS` | `0.0144 sec` | +| [Wundegraph](https://github.com/wundergraph/cosmo) | ✅ | `3,276 RPS` | `0.0261 sec` | +| [Apollo](https://github.com/apollographql/router) | ✅ | `2,222 RPS` | `0.0395 sec` | | **Cached** | | | | -| [Tailcall](https://github.com/tailcallhq/tailcall) | ✅ | `40,558 RPS` | `0.0022 sec` | -| [Grafbase](https://github.com/grafbase/grafbase) | ✅ | `16,967 RPS` | `0.0054 sec` | -| [Wundegraph](https://github.com/wundergraph/cosmo) | ✅ | `10,763 RPS` | `0.011 sec` | +| [Tailcall](https://github.com/tailcallhq/tailcall) | ✅ | `16,215 RPS` | `0.0101 sec` | +| [Grafbase](https://github.com/grafbase/grafbase) | ✅ | `6,928 RPS` | `0.0134 sec` | +| [Wundegraph](https://github.com/wundergraph/cosmo) | ✅ | `5,692 RPS` | `0.022 sec` | ### [Medium Payload - 12,598 bytes](./source/medium.json) | Server | Status | RPS | Latency | | ---: | ---: | ---: | ---: | -| [Nginx](https://nginx.org/en/) | ✅ | `11,426 RPS` | `0.0108 sec` | +| [Nginx](https://nginx.org/en/) | ✅ | `4,959 RPS` | `0.0158 sec` | | **Base** | | | | -| [Tailcall](https://github.com/tailcallhq/tailcall) | ✅ | `10,005 RPS` | `0.0074 sec` | -| [Grafbase](https://github.com/grafbase/grafbase) | ✅ | `8,394 RPS` | `0.0086 sec` | -| [Wundegraph](https://github.com/wundergraph/cosmo) | ✅ | `3,702 RPS` | `0.0224 sec` | -| [Apollo](https://github.com/apollographql/router) | ✅ | `4,146 RPS` | `0.0181 sec` | +| [Tailcall](https://github.com/tailcallhq/tailcall) | ✅ | `4,769 RPS` | `0.0147 sec` | +| [Grafbase](https://github.com/grafbase/grafbase) | ✅ | `4,108 RPS` | `0.0167 sec` | +| [Wundegraph](https://github.com/wundergraph/cosmo) | ✅ | `1,445 RPS` | `0.0717 sec` | +| [Apollo](https://github.com/apollographql/router) | ✅ | `1,949 RPS` | `0.0454 sec` | | **Cached** | | | | -| [Tailcall](https://github.com/tailcallhq/tailcall) | ✅ | `30,781 RPS` | `0.0028 sec` | -| [Grafbase](https://github.com/grafbase/grafbase) | ✅ | `12,354 RPS` | `0.007 sec` | -| [Wundegraph](https://github.com/wundergraph/cosmo) | ✅ | `6,339 RPS` | `0.018 sec` | +| [Tailcall](https://github.com/tailcallhq/tailcall) | ✅ | `12,503 RPS` | `0.0079 sec` | +| [Grafbase](https://github.com/grafbase/grafbase) | ✅ | `5,724 RPS` | `0.0136 sec` | +| [Wundegraph](https://github.com/wundergraph/cosmo) | ✅ | `2,912 RPS` | `0.0423 sec` | ### [Big Payload - 112,838 bytes](./source/big.json) | Server | Status | RPS | Latency | | ---: | ---: | ---: | ---: | -| [Nginx](https://nginx.org/en/) | ✅ | `5,299 RPS` | `0.0163 sec` | +| [Nginx](https://nginx.org/en/) | ✅ | `2,066 RPS` | `0.0613 sec` | | **Base** | | | | -| [Tailcall](https://github.com/tailcallhq/tailcall) | ✅ | `3,261 RPS` | `0.0225 sec` | -| [Grafbase](https://github.com/grafbase/grafbase) | ✅ | `3,810 RPS` | `0.0198 sec` | -| [Wundegraph](https://github.com/wundergraph/cosmo) | ✅ | `2,174 RPS` | `0.0546 sec` | -| [Apollo](https://github.com/apollographql/router) | ✅ | `2,282 RPS` | `0.0326 sec` | +| [Tailcall](https://github.com/tailcallhq/tailcall) | ✅ | `1,546 RPS` | `0.0502 sec` | +| [Grafbase](https://github.com/grafbase/grafbase) | ✅ | `1,757 RPS` | `0.0518 sec` | +| [Wundegraph](https://github.com/wundergraph/cosmo) | ✅ | `888 RPS` | `0.11 sec` | +| [Apollo](https://github.com/apollographql/router) | ✅ | `1,214 RPS` | `0.0592 sec` | | **Cached** | | | | -| [Tailcall](https://github.com/tailcallhq/tailcall) | ✅ | `17,631 RPS` | `0.0045 sec` | -| [Grafbase](https://github.com/grafbase/grafbase) | ✅ | `4,609 RPS` | `0.0188 sec` | -| [Wundegraph](https://github.com/wundergraph/cosmo) | ✅ | `2,933 RPS` | `0.0394 sec` | +| [Tailcall](https://github.com/tailcallhq/tailcall) | ✅ | `7,763 RPS` | `0.0115 sec` | +| [Grafbase](https://github.com/grafbase/grafbase) | ✅ | `2,292 RPS` | `0.0354 sec` | +| [Wundegraph](https://github.com/wundergraph/cosmo) | ✅ | `1,492 RPS` | `0.0731 sec` | ### RPS Plots diff --git a/files/p95_cached.png b/files/p95_cached.png new file mode 100644 index 0000000000000000000000000000000000000000..3e1a1b7215ca7a5dbcd9cc07dc573005572c6ad8 GIT binary patch literal 6756 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 literal 0 HcmV?d00001 diff --git a/files/rps_cached.png b/files/rps_cached.png new file mode 100644 index 0000000000000000000000000000000000000000..14d9ca1ce53150ae472224e7647adc016bd06d72 GIT binary patch literal 6339 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 DSpD0T literal 6543 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