The idea behind this benchmark is to re-evaluate results presented by Techempower's Benchmark benchmarking best & promising open-source frameworks.
I just found Techempower's Benchmark sources overcomplicated.
Also wanted to test only framework overhead, that's why testing just trivial
dynamic Hello World world output.
Just to not raise a controversy, I want also to emphasize this benchmark is simple & native and completely skips some unique features of some frameworks and languages, such as Erlang's natural clustering and hot-swap capabilities.
| Language | Framework | Req/sec1 | MB/sec | 99% ms2 |
|---|---|---|---|---|
| Java | Undertow | 616 547 | 80.55 | 3.29 |
| C | Kore3 | 572 782 | 104.33 | 3.99 |
| C | libmicrohttpd | 533 626 | 69.72 | 1.28 |
| Go | fasthttp | 485 185 | 67.56 | 5.26 |
| C | Onion4 | 483 824 | 90.90 | 2.82 |
| Java | Netty | 422 580 | 40.30 | 4.08 |
| Nim m&s 6 | AsyncHTTPServer | 404 040 | 43.93 | 3.98 |
| Native | Nginx5 | 381 368 | 43.26 | 24.24 |
| Go | net/http | 270 253 | 34.28 | 2.52 |
| Lua | OpenResty7 | 269 205 | 30.28 | 43.35 |
| C++ | Crow | 256 552 | 31.32 | 12.28 |
| Rust | Iron | 178 789 | 19.44 | 0.05 8 |
| Erlang | Cowboy9 | 163 521 | 24.01 | 5.41 |
| Node | HTTP | 112 086 | 13.79 | 11.98 |
| Nim m&s10 | AsyncHTTPServer | 86 741 | 9.43 | 1.40 |
| Nim m&s10 | Jester11 | 83 753 | 5.99 | 1.50 |
| Ruby | Puma12 | 83 053 | 6.02 | 6.14 |
| D ldc2 13 | Vibe.d0.7.26 | 79 602 | 13.28 | 46.41 |
| D dmd 14 | Vibe.d0.7.26 | 76 839 | 12.75 | 103.05 |
| Nim 15 | AsyncHTTPServer | 52 843 | 5.75 | 4.76 |
| Nim 15 | Jester | 42 698 | 3.05 | 5.42 |
1Ubuntu 14.04 LTS, Linux 3.16,
Xeon E5-1650 @ 3.50GHz, 32 GB RAM
2 Latency distribution value at 99% in milliseconds
(towards worst)
3Core built without SSL via using make NOTLS=1.
4 Running hello example with static path.
5 Using Nginxecho module.
6Nim using --gc:markandsweep, pre-forked processes
using SO_REUSEPORT.
7OpenResty is in fact Nginx with Lua module.
8RustIron has some amazing super-stable latency
in longer runs.
9Cowboy requires some low level tweaking via sysctl, see
and apply sysctl.conf.
10Nim using --gc:markandsweep, single-thread only.
11Jester is some higher-level web framework for Nim.
12 Using several Ruby instances with puma -w 12.
13D language using LDC2 compiler v0.16.1 (LLVM 3.7.0).
14D language using standard DMD compiler v2.069.1.
15Nim using standard RC garbage collection, single-thread only.
NOTE: Detailed results can be found in results/.
Each web framework is expected to respond with Hello World content of type
text/plain with minimum set of headers required by HTTP 1.1 specification:
$ curl -i localhost:8080
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Length: 11
Content-Type: text/plain
Date: Tue, 24 Nov 2015 17:32:30 GMT
Hello World
Some frameworks add extra headers such as Server or Expire by default,
which are not required by HTTP 1.1 specification. If possible we use some
settings or tweaks to remove them as more headers (so more data) will have
negative impact on performance.
Effectively this benchmark tests solely the framework overhead itself. We are not testing any database access or JSON serialization performance. We are also avoiding some extra optimizations, such as caching response memory structures which could improve performance a bit, but contradicts dynamic behavior of tested frameworks.
As expected Java solution - Undertow is most optimized. 2nd & 3rd places are occupied by native C frameworks - Kore and libmicrohttpd.
Finally new fasthttpGo solution takes 4th place, being very close to the top 3. Go is very flexible little language, improving productivity and it is used already by many companies to deliver some heavy-load network services.
It has to be also observed that different frameworks generated different amount of data due different HTTP headers being used.
This benchmark is provided under MIT license:
Copyright (c) 2015 Adam Strzelecki
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.