Benchmarks for @mionkit/http 🚀
- These benchmarks are based on the fastify benchmarks repo!
@MionKit/http
is part of the mion Framework. It uses and RPC style router!- This package shows how fast is mion comparatively to full featured frameworks like fastify and others.
- You can find a full list of many other small and faster servers in the original fastify benchmarks repo.
- For cold-start metrics see cold-starts.md
📚 Full mion framework documentation here!
install packages & link mion packages
npm i
npm link @mionkit/router @mionkit/core @mionkit/bun @mionkit/http
# running all benchmarks and update all readmes
npm run report
- Cold start times: This is a metric we specially want to keep in check as fast cold start times are essential for serverless environments
COLD-STARTS.md
The test consist of an updateUser
request where the fields of the user must be validated, the lastUpdate
field is a date that must be transformed into a JS Date (deserialized), then add one month and send back in the response.
The benchmark involves both routing + validation of parameters!
export interface User {
id: number;
name: string;
surname: string;
lastUpdate: Date;
}
// ### mion ###
// the received user by the route is already validated and deserialized
// user.lastUpdate is already a js date instead and string (result of JSON.parse)
export const routes: Routes = {
updateUser: (context, user: User): User => {
user.lastUpdate.setMonth(user.lastUpdate.getMonth() + 1);
return user;
},
};
// ### Express ###
// A plugin must be used to parse the json body
// validation must be done manually and user.lastUpdate must be deserialized manually into a date
// in this case developer would have to manually write `isUser` and `deserializeUser` functions. (check src code fo those functions)
app.post("/updateUser", function (req, res) {
const rawUser = req.body?.updateUser;
if (!isUser(rawUser)) throw "app error, invalid parameter, not a user";
const user = deserializeUser(rawUser);
user.lastUpdate.setMonth(user.lastUpdate.getMonth() + 1);
res.json(user);
});
mion is focused on being lightweight and fast so it can be run in serverless environments. We run the benchmarks before every PR gets merged to ensure there is no performance regression. There are PRs that has been rejected because due to performance regression.
Our goal is to perform similar to fastify as it is the industry standard in terms of performance. Please always take benchmarks as general guidelines as you might obtain different results in your real world application. we just run the benchmarks to ensure there is no performance degradation when new features/fixes are added to mion.
- Machine: darwin x64 | 8 vCPUs | 16.0GB Mem
- Node:
v20.11.0
- Run: Mon Jan 29 2024 22:19:00 GMT+0000 (Greenwich Mean Time)
- Method:
autocannon -c 100 -d 40.02 -p 10 localhost:3000
(two rounds; one to warm-up, one to measure)
Version | Router | Req (R/s) | Latency (ms) | Output (Mb/s) | Max Memory (Mb) | Max Cpu (%) | Validation | Description | |
---|---|---|---|---|---|---|---|---|---|
http-node | 16.18.0 | ✗ | 18598.0 | 53.24 | 4.47 | 79 | 126 | ✗ | bare node http server, should be the theoretical upper limit in node.js performance |
mion.bun | 0.6.2 | ✓ | 17023.2 | 58.22 | 3.94 | 111 | 106 | ✓ | mion using bun, automatic validation and serialization |
fastify | 4.10.2 | ✓ | 16961.8 | 58.41 | 4.09 | 87 | 122 | - | Validation using schemas and ajv. schemas are generated manually |
mion | 0.6.2 | ✓ | 13936.0 | 71.21 | 3.85 | 136 | 139 | ✓ | Automatic validation and serialization out of the box |
restify | 11.1.0 | ✓ | 12776.6 | 77.70 | 3.28 | 130 | 125 | ✗ | manual validation or third party tools |
hapi | 21.3.2 | ✓ | 8870.8 | 112.09 | 2.13 | 103 | 134 | ✗ | validation using joi or third party tools |
hono | 3.12.6 | ✓ | 5763.7 | 172.66 | 1.39 | 123 | 134 | ✗ | hono node server, manual validation or third party tools |
express | 4.18.2 | ✓ | 4596.6 | 213.24 | 1.10 | 122 | 126 | ✗ | manual validation or third party tools |