Vix.cpp vs Drogon vs Crow: a local benchmark of the v2.7.0 HTTP runtime
Vix.cpp v2.7.0 is moving forward, and one of the things I wanted to validate more seriously before pushing this release further was the HTTP runtime.
Vix.cpp is not only a web framework. It is a C++ application platform and developer toolkit around real native C++ projects. The goal is to make C++ development more direct: create a project, run it, build it, test it, install SDK profiles, use modules, package applications, and prepare them for production without losing the native C++ model.
But even if Vix.cpp is broader than a web framework, the HTTP runtime still has to be fast.
So I decided to compare it with two known C++ web frameworks: Drogon and Crow.
Drogon is one of the strongest references in high-performance C++ web development. Crow is also well known because it gives C++ developers a simple and lightweight way to write web services.
That makes this comparison useful.
Not because Vix.cpp is trying to become Drogon or Crow, but because developers need a clear idea of where Vix.cpp stands when the discussion is about C++ HTTP performance.
Website: https://vixcpp.com
The benchmark context
This benchmark was not run on a cloud server.
It was not run on a dedicated bare-metal benchmark machine.
It was run locally on my laptop, the same machine I use for development.
The machine was an HP EliteBook running Linux on x86_64 with 8 CPU threads.
Platform : linux
Architecture : x86_64
Kernel version : 6.17.0-35-generic
Hostname : softadastra-HP-EliteBook-x360-1030-G3
CPU count : 8
Page size : 4096 bytes
That detail matters because the goal of this benchmark was not to claim a universal performance result.
The goal was more practical.
I wanted to see how Vix.cpp behaves on the same machine, with the same benchmark pressure, against two known C++ web frameworks.
Benchmark command
Each framework was tested with a simple endpoint:
/bench
The benchmark command was the same:
wrk -t8 -c800 -d30s --latency http://127.0.0.1:8080/bench
This means:
8 wrk threads
800 concurrent connections
30 seconds duration
latency distribution enabled
The server runtime was also configured around 8 threads where applicable.
This benchmark does not include database access, JSON serialization, authentication, templates, file serving, middleware chains, TLS, or application logic.
It is a simple HTTP runtime benchmark.
That makes it limited, but still useful.
A runtime that wants to support real C++ applications should at least show that it can handle a simple high-concurrency HTTP endpoint correctly.
Drogon result
Drogon was the fastest in raw throughput in this run.
Running 30s test @ http://127.0.0.1:8080/bench
8 threads and 800 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 6.38ms 4.61ms 94.29ms 72.13%
Req/Sec 14.51k 3.71k 37.65k 74.49%
Latency Distribution
50% 5.49ms
75% 8.64ms
90% 12.03ms
99% 21.16ms
3461890 requests in 30.06s, 498.53MB read
Requests/sec: 115151.01
Transfer/sec: 16.58MB
The important number here is:
Drogon: 115,151.01 requests/sec
This is a strong result, and it confirms why Drogon is usually treated as one of the serious references for C++ HTTP performance.
Vix.cpp result
Vix.cpp came very close to Drogon in raw throughput.
Running 30s test @ http://127.0.0.1:8080/bench
8 threads and 800 connections
Latency:
Avg: 7.31ms
Stdev: 16.26ms
Max: 606.15ms
Latency Distribution:
50%: 6.51ms
75%: 7.59ms
90%: 8.73ms
99%: 12.19ms
Requests:
3,386,276 requests in 30.09s
112,539.11 requests/sec
The throughput result was:
Vix.cpp: 112,539.11 requests/sec
For me, the most interesting part is not only that Vix.cpp reached 112k requests per second.
The more important signal is the p99 latency.
At 800 concurrent connections, Vix.cpp stayed at:
p99: 12.19ms
That is the best p99 latency result in this local run.
Crow result
Crow also stayed fast, but it was behind both Drogon and Vix.cpp in this benchmark.
Running 30s test @ http://127.0.0.1:8080/bench
8 threads and 800 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 8.30ms 5.31ms 92.21ms 80.21%
Req/Sec 11.76k 2.54k 30.21k 72.62%
Latency Distribution
50% 7.21ms
75% 10.40ms
90% 14.72ms
99% 26.76ms
2809917 requests in 30.10s, 324.25MB read
Requests/sec: 93339.82
Transfer/sec: 10.77MB
The throughput result was:
Crow: 93,339.82 requests/sec
Crow remains simple and useful, especially for small C++ web services, but in this specific benchmark it was behind Drogon and Vix.cpp.
Summary table
| Framework | Requests/sec | Avg latency | P50 | P90 | P99 |
|---|---|---|---|---|---|
| Drogon | 115,151.01 | 6.38 ms | 5.49 ms | 12.03 ms | 21.16 ms |
| Vix.cpp | 112,539.11 | 7.31 ms | 6.51 ms | 8.73 ms | 12.19 ms |
| Crow | 93,339.82 | 8.30 ms | 7.21 ms | 14.72 ms | 26.76 ms |
The comparison in one paragraph
On this local benchmark, Drogon is slightly ahead in raw throughput with 115,151.01 requests/sec, Vix.cpp stays very close with 112,539.11 requests/sec, and Crow reaches 93,339.82 requests/sec.
The most interesting part for Vix.cpp is the latency distribution: Vix.cpp had the best p99 latency in this run with 12.19ms, compared to 21.16ms for Drogon and 26.76ms for Crow.
That is the comparison I want people to remember.
Drogon is still ahead in raw throughput.
Vix.cpp is very close to Drogon.
Vix.cpp is ahead of Crow in this run.
And Vix.cpp has the best p99 latency in this benchmark.
What the numbers mean
The raw throughput result is close between Drogon and Vix.cpp.
Drogon : 115,151.01 req/s
Vix.cpp: 112,539.11 req/s
That difference is around 2.27%.
For a project like Vix.cpp, that matters because Vix.cpp is not only trying to expose HTTP routes. It also carries a bigger platform direction around the CLI, SDK profiles, modules, registry workflow, project commands, diagnostics, and production preparation.
So being close to Drogon at the HTTP runtime level is a good sign.
Compared to Crow, the difference is larger.
Vix.cpp: 112,539.11 req/s
Crow : 93,339.82 req/s
That is around 20.57% more requests per second for Vix.cpp in this local run.
But again, the result I care about most is the p99 latency.
Vix.cpp: 12.19ms
Drogon : 21.16ms
Crow : 26.76ms
Throughput is easy to look at because it gives one big number.
Latency is more interesting because it shows how the runtime behaves under pressure, especially near the tail.
A runtime can look good on average and still feel unstable when the tail latency grows too much.
In this run, Vix.cpp showed a strong p99 result.
Why compare Vix.cpp with Drogon and Crow?
Because those are the names people already know.
When someone talks about C++ web frameworks, Drogon and Crow usually come up quickly.
That is normal.
Drogon has a strong performance reputation.
Crow has a simple and familiar style.
So if Vix.cpp is going to be taken seriously as a modern C++ application platform, it needs to stand next to the tools developers already recognize.
This comparison is not about attacking Drogon or Crow.
Both are valuable C++ projects.
The point is to show that Vix.cpp is not only about developer experience. It is also moving in a competitive runtime direction.
Vix.cpp is not just another C++ web framework
This part is important.
Drogon and Crow are mainly focused on the web framework question:
How do I build a C++ web service?
Vix.cpp is trying to answer a wider question:
How do I build, run, test, package, extend, and maintain a real native C++ application?
That difference matters because most C++ friction does not come from the language alone.
It also comes from everything around the language.
Project setup.
Build configuration.
Dependency workflow.
Running examples.
Testing.
Packaging.
Installing runtime profiles.
Checking the environment.
Preparing a project for production.
Keeping the workflow understandable as the application grows.
Vix.cpp exists around that problem.
The HTTP runtime is one piece of it, but it is an important piece because modern applications often need APIs, services, realtime features, internal dashboards, tools, and backend workflows.
What this benchmark does not prove
This benchmark does not prove that Vix.cpp is always faster than Drogon.
It does not prove that Vix.cpp is always faster than Crow.
It does not prove that one framework is better for every workload.
A real application can change the result completely depending on what it does.
Database queries can dominate everything.
JSON serialization can change the profile.
TLS can change the cost.
Middleware can add overhead.
Logging can slow down hot paths.
Memory allocation patterns can become more important than routing.
Static files, request bodies, WebSocket traffic, cache layers, and business logic can all change the final behavior.
So this benchmark should be read honestly.
It is a simple local HTTP benchmark.
Nothing more.
But it is still a useful signal.
It shows that the current Vix.cpp HTTP runtime is already competitive on a basic high-concurrency endpoint.
Why the p99 result matters to me
The 112k req/s number is nice.
It looks good in a table.
It is easy to share.
But the p99 latency matters more to me because it gives a better signal about the runtime behavior under load.
In this benchmark, Vix.cpp did not only process many requests.
It kept the p99 latency lower than both Drogon and Crow.
Vix.cpp p99: 12.19ms
Drogon p99 : 21.16ms
Crow p99 : 26.76ms
That does not mean Vix.cpp will always win p99 in every situation.
But it does mean the v2.7.0 runtime direction is promising.
And that is what I wanted to verify.
The current position of Vix.cpp
After this benchmark, I would describe the current position like this:
Drogon is still slightly ahead in raw throughput.
Vix.cpp is very close to Drogon.
Vix.cpp is ahead of Crow in this local run.
Vix.cpp has the best p99 latency in this benchmark.
That is a good place for Vix.cpp v2.7.0 to be.
Especially because Vix.cpp is still growing as a full platform, not only as an HTTP router.
The goal is not to win one chart and stop there.
The goal is to keep building a C++ workflow that feels modern while staying native, fast, and understandable.
What comes next
This benchmark is only one step.
The next useful tests should be more realistic.
I want to test:
- different concurrency levels,
- longer benchmark durations,
- JSON responses,
- larger response bodies,
- route-heavy applications,
- WebSocket workloads,
- middleware-heavy endpoints,
- file serving,
- real application endpoints,
- different machines,
- and different compiler configurations.
That will give a better picture than a single Hello World benchmark.
But this first comparison is still important because it gives a clean baseline.
Before testing complex applications, the runtime should behave well on the simplest endpoint.
Here, Vix.cpp does.
Final result
The final result of this local benchmark is simple:
Drogon : 115,151.01 req/s
Vix.cpp: 112,539.11 req/s
Crow : 93,339.82 req/s
And the p99 latency result is:
Vix.cpp: 12.19ms
Drogon : 21.16ms
Crow : 26.76ms
So the fair conclusion is this:
Vix.cpp v2.7.0 is very close to Drogon in raw throughput, ahead of Crow in this run, and shows the best p99 latency on this local benchmark.
That is a strong signal for the current direction of the HTTP runtime.
Vix.cpp is still growing, but the foundation is becoming stronger.
The goal remains the same: make C++ development feel more direct, more modern, and more reliable without hiding the power of the language.
Links
Website: https://vixcpp.com
Documentation: https://docs.vixcpp.com
Registry: https://registry.vixcpp.com
Engineering notes: https://blog.vixcpp.com
GitHub: https://github.com/vixcpp/vix
Top comments (0)