Real-world application benchmarks
This is an index of my popular real world application benchmark series. All the benchmark applications have been chosen from reader’s feedback. The benchmarks, measurements, and applications are quite different from techempower benchmarks (here).
If you like to suggest more real-world application benchmarking, please add your suggestions in the comments.
Use case 1 — JWT verify & MySQL query
The use case is:
- Get JWT from the authorization header
- Verify JWT & get email from claims
- Perform a MySQL query with email
- Return the user record
If you don’t have time, here is the executive summary (sorted on RPS) for this use case:
Here is the list of articles for all possible combinations for this use-case:
- Node.js vs Deno
- Node.js vs Bun
- Deno vs Bun
- Node.js vs Python
- Node.js vs SpringBoot
- Node.js vs SpringBoot Webflux
- Node.js vs Go
- Node.js vs Rust
- Deno vs Python
- Deno vs SpringBoot
- Deno vs SpringBoot Webflux
- Deno vs Go
- Deno vs Rust
- Bun vs Python
- Bun vs SpringBoot
- Bun vs SpringBoot Webflux
- Bun vs Go
- Bun vs Rust
- Python vs SpringBoot
- Python vs SpringBoot Webflux
- Python vs Go
- Python vs Rust
- SpringBoot vs Webflux
- SpringBoot vs Go
- SpringBoot vs Rust
- SpringBoot Webflux vs Go
- SpringBoot Webflux vs Rust
- Go vs Rust
- Node.js : Express vs Fastify
- Node.js: Express vs Koa
- Node.js: Fastify vs Koa
- Fastify vs SpringBoot
- Fastify vs SpringBoot Webflux
- Fastify vs Go
- Fastify vs Rust
- NestJS vs SpringBoot
- NestJS vs SpringBoot Webflux
- NestJS vs Go
- NestJS vs Rust
- NestJS (Fastify) vs SpringBoot
- NestJS (Fastify) vs SpringBoot Webflux
- NestJS (Fastify) vs Go
- NestJS (Fastify) vs Rust
- NestJS (Express) vs NestJS (Fastify)
- NestJS Cluster vs SprintBoot with virtual threads
- NestJS Cluster vs SpringBoot Webflux
- NestJS Cluster vs Go
- NestJS Cluster vs Rust
- Fastify Cluster vs SpringBoot (virtual threads)
- Fastify Cluster vs SpringBoot webflux
- Fastify Cluster vs Go
- Fastify Cluster vs Rust
- SpringBoot Virtual threads vs Webflux
Use case 2— Static file server
The use case is:
- Get the file name from the URL
- Send the file in the HTTP response
There are a total of 100K files. Each file size is also 100K.
If you don’t have time, here is the executive summary (sorted on RPS) for this use case:
- Express vs Deno
- Express vs Bun
- Express vs Python
- Express vs Go
- Express vs Rust
- Express vs SpringBoot MVC
- Express vs SpringBoot Webflux
- Express vs Fastify
- Fastify vs Deno
- Fastify vs Bun
- Fastify vs Python
- Fastify vs Go
- Fastify vs Rust
- Fastify vs SpringBoot MVC
- Fastify vs SpringBoot Webflux
- Deno vs Bun
- Deno vs Python
- Deno vs Go
- Deno vs Rust
- Deno vs SpringBoot MVC
- Deno vs SpringBoot Webflux
- Bun vs Python
- Bun vs Go
- Bun vs Rust
- Bun vs SpringBoot MVC
- Bun vs SpringBoot Webflux
- Python vs Go
- Python vs Rust
- Python vs SpringBoot MVC
- Python vs SpringBoot Webflux
- Go vs Rust
- Go vs SpringBoot MVC
- Go vs SpringBoot Webflux
- Rust vs SpringBoot MVC
- Rust vs SpringBoot Webflux
- SpringBoot MVC vs SpringBoot Webflux
- NestJS vs Deno
- NestJS vs Bun
- NestJS vs Python
- NestJS vs Go
- NestJS vs Rust
- NestJS vs SpringBoot MVC
- NestJS vs SpringBoot Webflux
- NestJS vs Fastify
Use case 3 — Multipart/form-data uploads
The use case is:
- Receive a multipart file upload request
- There are two files in each request (each file size is 100K)
- Save the files on disk
If you don’t have time, here is the executive summary (sorted on RPS) for this use case:
- Node multer vs Deno
- Node multer vs Bun
- Node multer vs Python
- Node multer vs SpringBoot MVC
- Node multer vs SpringBoot Webflux
- Node multer vs Go
- Node multer vs Rust
- Deno vs Bun
- Deno vs Python
- Deno vs SpringBoot MVC
- Deno vs SpringBoot Webflux
- Deno vs Go
- Deno vs Rust
- Bun vs Python
- Bun vs SpringBoot MVC
- Bun vs SpringBoot Webflux
- Bun vs Go
- Bun vs Rust
- Python vs SpringBoot MVC
- Python vs SpringBoot Webflux
- Python vs Go
- Python vs Rust
- SpringBoot MVC vs SpringBoot Webflux
- SpringBoot MVC vs Go
- SpringBoot MVC vs Rust
- SpringBoot Webflux vs Go
- SpringBoot Webflux vs Rust
- Go vs Rust
- Node Koa vs Deno
- Node Koa vs Bun
- Node Koa vs Python
- Node Koa vs SpringBoot MVC
- Node Koa vs SpringBoot Webflux
- Node Koa vs Go
- Node Koa vs Rust
- Node Multer vs Koa
- NestJS vs Multer
- NestJS vs Koa
- NestJS vs Deno
- NestJS vs Bun
- NestJS vs Python
- NestJS vs SpringBoot MVC
- NestJS vs SpringBoot Webflux
- NestJS vs Go
- NestJS vs Rust
Use case — 4 QR Generator API
The use case is:
- Receive a JSON request body over HTTPS
- Extract URL out of the request body
- Generate a QR code (PNG) for the given URL
- Return the QR code in the HTTP response
If you don’t have time, here is the executive summary (sorted on RPS) for this use case:
- NestJS cluster vs SpringBoot virtual threads
- NestJS cluster vs SpringBoot webflux
- NestJS cluster vs Go
- NestJS cluster vs Rust
- Fastify cluster vs SpringBoot virtual threads
- Fastify cluster vs SpringBoot webflux
- Fastify cluster vs Go
- Fastify cluster vs Rust
- SpringBoot virtual threads vs Rust
- SpringBoot virtual threads vs Go
- SpringBoot webflux vs Rust
- SpringBoot webflux vs Go
- SpringBoot virtual threads vs webflux
- Go vs Rust
Use case 5 — URL shortener service (postgres)
The use case is:
- Application receives a URL in the JSON request body
- Application generates a short ID for the URL
- Application stores short ID and the received URL into postgres database
- Application returns a short URL in the response
The detailed benchmarks are as follows:
- Node.js native server vs Express
- Node.js native server vs Fastify
- Express vs Fastify
- Express vs Deno
- Fastify vs Deno
- Express vs Bun
- Fastify vs Bun
- Express vs Python FastAPI
- Fastify vs Python FastAPI
- Deno vs Python FastAPI
- Bun vs Python FastAPI
- Deno vs Bun
- Express vs Go
- Fastify vs Go
- Deno vs Go
- Bun vs Go
- Express cluster vs Go
- Fastify cluster vs Go
- Bun vs Spring Boot
- Go vs Spring Boot
- Express cluster vs Quarkus
- Fastify cluster vs Quarkus
- Deno vs Quarkus
- Bun vs Quarkus
- Go vs Quarkus
- Spring Boot vs Quarkus
- Express cluster vs Rust
- Fastify cluster vs Rust
- Bun vs Rust
- Spring Boot vs Rust
- Quarkus vs Rust
- Go vs Rust
Use case 6 — JWT sign & verify
The use case is as follows:
- Selection of the next email address.
- Creation of a payload containing sub, iat, and exp fields.
- Signing and generating a compact JWT.
- Running the JWT through the verification process.
- Retrieval of the payload and verification of the associated email.
If you don’t have time, here is the executive summary (sorted on OPs/second) for this use case:
Thanks for reading the series.