veil-python
Experimental · Python · engine: veil · standard configuration · completeness 3/4
veil-api 0.10 from PyPI (Python bindings of the veil server; Linux wheels use the epoll readiness reactor). @app.get/@app.post handlers with path/query binding, dict responses serialized to JSON, async def handlers on veil's persistent asyncio event loop, @app.websocket for /ws, gRPC through the grpcio-generated servicer on veil.grpc.Server, /static/* through app.serve_dir, compression through [api] compression. One process with four listeners from the configuration file.
- Official repository
- Official website
- Benchmark implementation
- All Python entries, compared
- Open the leaderboard
Achievements
🥇 1 Gold · 🥈 1 Silver. Top three of a field, taken in this entry's own league: the family composite, the same composite among entries written in the same language, and each test profile it is scored on. Every field is the one the badges publish, so a medal and a badge always say the same thing. How medals are awarded.
| Medal | Award | Field | Rank |
|---|---|---|---|
| 🥇 Gold | Test profile | Efficiency · Latency-10K | 1 of 24 |
| 🥈 Silver | Test profile | HTTP/2 · Static | 2 of 11 |
Composite rank
Each profile of a family is worth 100 to the entry that leads it, and the composite is the sum over the family, less 2.5% for each of routing, middleware, request and response the entry does not do for you - its completeness factor, which the WebSocket and gRPC families do not carry. The field is this entry's own league: engines and reverse proxies are scored apart from frameworks. How it works.
| Family | Rank | Composite |
|---|---|---|
| HTTP/1.1 | 26 of 26 | 566 |
| HTTP/2 | 9 of 12 | 672 |
| HTTP/3 | 7 of 9 | 268 |
| gRPC | 5 of 5 | 6 |
| WebSocket | 20 of 20 | 52 |
Every result
Alpha Round, 35 runs. Requests per second is the best of three; latency, CPU and memory come from that run.
| Category | Profile | Conns | Req/sec | Avg | p99 | CPU | Memory |
|---|---|---|---|---|---|---|---|
| Connection | Baseline | 4,096 | 18,278 | 219.73ms | 322.20ms | 182.4% | 263MiB |
| Connection | Pipelined | 4,096 | 29,490 | 34.74ms | 38.70ms | 172.0% | 116MiB |
| Connection | Short-lived | 4,096 | 18,333 | 217.46ms | 455.50ms | 185.0% | 295MiB |
| Concurrency | Async Delay | 32,000 | 30,630 | 988.81ms | 1.14s | 1243.2% | 1.4GiB |
| Efficiency | Latency-10K | 1,024 | 9,983 | 221.4us | 1291.0us | 86.6% | 145MiB |
| Efficiency | Latency-1M | 1,024 | 19,069 | 9781444.4us | 19374080.0us | 161.7% | 147MiB |
| Efficiency | Latency-500K/8 | 1,024 | 24,530 | 9470574.2us | 18784256.0us | 182.9% | 69MiB |
| Workload | JSON Comp | 4,096 | 7,160 | 539.30ms | 636.40ms | 1647.8% | 862MiB |
| Workload | JSON Comp | 16,384 | 7,050 | 1.82s | 2.45s | 1528.2% | 1.3GiB |
| Workload | JSON TLS | 4,096 | 14,356 | 277.17ms | 360.91ms | 280.4% | 435MiB |
| Workload | 8Gbit | 512 | 36,128 | 661409.5us | 1309184.0us | 398.4% | 196MiB |
| Workload | Static TLS | 1,024 | 926,062 | 1.05ms | 18.35ms | 6352.7% | 617MiB |
| HTTP/2 | Baseline | 256 | 22,142 | 769.75ms | 2.92s | 156.0% | 182MiB |
| HTTP/2 | Baseline | 1,024 | 19,564 | 1.91s | 4.89s | 166.2% | 406MiB |
| HTTP/2 | Static | 256 | 1,051,679 | 6.11ms | 4.96s | 6350.9% | 1.0GiB |
| HTTP/2 | Static | 1,024 | 968,986 | 22.77ms | 4.90s | 6479.9% | 1.2GiB |
| HTTP/2 | Baseline (h2c) | 256 | 22,211 | 870.43ms | 3.15s | 143.1% | 218MiB |
| HTTP/2 | Baseline (h2c) | 1,024 | 19,366 | 2.49s | 4.99s | 146.3% | 321MiB |
| HTTP/2 | Baseline (h2c) | 4,096 | 19,230 | 2.57s | 4.98s | 151.9% | 434MiB |
| HTTP/2 | JSON (h2c) | 1,024 | 11,755 | 1.99s | 2.75s | 786.8% | 950MiB |
| HTTP/2 | JSON (h2c) | 4,096 | 9,271 | 2.71s | 4.99s | 1781.1% | 2.6GiB |
| HTTP/3 | Baseline | 64 | 36,624 | 85.48ms | 678.99ms | 170.3% | 181MiB |
| HTTP/3 | Static | 64 | 260,493 | 17.39ms | 57.30ms | 3736.5% | 1019MiB |
| gRPC | Unary | 256 | 25,819 | 896.14ms | 1.22s | 1124.8% | 680MiB |
| gRPC | Unary | 1,024 | 13,154 | 2.94s | 5.00s | 2041.0% | 2.4GiB |
| gRPC | Unary TLS | 256 | 28,540 | 807.50ms | 965.57ms | 1094.7% | 684MiB |
| gRPC | Unary TLS | 1,024 | 15,196 | 2.85s | 4.97s | 1987.0% | 2.4GiB |
| WebSocket | Echo | 512 | 116,936 | 4.38ms | 6.70ms | 491.0% | 132MiB |
| WebSocket | Echo | 4,096 | 81,509 | 49.27ms | 73.40ms | 787.8% | 312MiB |
| WebSocket | Echo | 16,384 | 60,669 | 243.60ms | 365.30ms | 1197.6% | 971MiB |
| WebSocket | Echo Pipelined | 512 | 345,789 | 23.70ms | 29.30ms | 279.8% | 138MiB |
| WebSocket | Echo Pipelined | 4,096 | 317,328 | 200.66ms | 217.00ms | 491.7% | 360MiB |
| WebSocket | Echo Pipelined | 16,384 | 274,138 | 823.64ms | 916.50ms | 1043.0% | 1.0GiB |
| WebSocket | Echo Short-lived | 512 | 72,837 | 6.34ms | 9.20ms | 572.2% | 167MiB |
| WebSocket | Echo Short-lived | 4,096 | 56,534 | 62.58ms | 117.30ms | 991.7% | 396MiB |
Compared with
The Python entries around veil-python on the HTTP/1.1 composite, and the one leading them. The last column shows every profile side by side.
| Entry | Composite | vs veil-python | |
|---|---|---|---|
| mipyre | 4185 | +640% | head to head |
| robyn | 856 | +51% | head to head |
| slimeweb | 814 | +44% | head to head |
| flask | 315 | -44% | head to head |
| bottle | 281 | -50% | head to head |
Compare veil-python with any Python entry · Compare veil-python with any entry, in any language · Every Python entry, ranked
Results updated · How the benchmark is run · The machine · Add or fix an entry