# simple-webframework-benchmark
**Repository Path**: greenlaw110/simple-webframework-benchmark
## Basic Information
- **Project Name**: simple-webframework-benchmark
- **Description**: 一个简单的webframework性能测试项目
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 0
- **Created**: 2017-01-28
- **Last Updated**: 2020-12-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Simple Web Framework Benchmark
**Disclaim:** This project is copied and adapted from https://github.com/networknt/light-java-example/tree/master/performance
**Note:** As suggested by the project name, this is a benchmark that only show very limited aspect about framework performance: how framework respond with a simple plain text message. For real comprehensive view on framework performance, please refer to https://www.techempower.com/benchmarks
## Benchmark result:
| Framework | Max Throughput | Avg Latency | Transfer |
| ------------ | -------------: | ----------: | -------: |
| [Go-Fast-HTTP](#go-fast) | 1888432.99 | 0.94ms | 226.92MB |
| [Light Java](#light-java) | 1678297.39 | 1.94ms | 169.66MB |
| [ActFramework](#act) | 761081.24 | 4.27ms | 119.76MB |
| [Spring Boot Reactor](#spring-reactor) | 384186.78 | 4.17ms | 28.21MB |
| [Spark](#spark) | 291954.47 | 11.14ms | 49.28MB |
| [RatPack](#ratpack) | 241775.80 | 8.44ms | 20.87MB |
| [Go-HTTP](#go) | 241484.14 | 7.02ms | 29.71MB |
| [JFinal 3](#jfinal) | 229960.41 | 8.93ms | 49.12MB |
| [Play-Java](#play-java) | 218074.28 | 13.80ms | 26.83MB |
| [AKKA-HTTP](#akka) | 200481.39 | 26.26ms | 29.64MB |
| [Iris (Go)](#iris) | 169879.19 | 11.25ms | 20.90MB |
| [Jooby/Undertow](#jooby) | 140645.13 | 15.91ms | 20.25MB |
| [Spring Boot Undertow](#spring-undertow) | 89433.13 | 18.88ms | 12.96MB |
| [Bootique + Jetty/Jersey](#bootique) | 82373.78 | 50.39ms | 14.14MB |
| [Dropwizard](#dropwizard) | 78079.06 | 57.73ms | 7.45MB |
| [Spring Boot Tomcat](#spring-tomcat) | 68554.49 | 42.84ms | 8.25MB |
| [Payra-Micro](#payra) | 61703.99 | 63.32ms | 8.71MB |
| [WildFly Swarm](#swarm) | 58179.11 | 20.08ms | 7.66MB |
| [Ninjaframework](#ninja) | 51948.21 | 27.55ms | 14.81MB |
| [Play-1](#play-1) | 50176.54 | 22.42ms | 21.44MB |
| [Node-express](#node) | 47429.61 | 23.26ms | 10.40MB |
| [msf4j](#msf4j) | fail | fail | fail |
## Benchmark environment and process
The benchmark is running on my local laptop with the following configuration:
* toshiba i7-4700MQ 16G RAM SSD
* Linuxmint 18.1
* Open JDK 1.8.0_121
* go 1.6.2 linux/amd64
The benchmark tool is [wrk](https://github.com/wg/wrk) and we are using pipeline.lua to generate more requests per second
For each testbed, we run at least twice using the command as shown below:
```
wrk -t4 -c128 -d30s http://localhost:8080 -s pipeline.lua --latency -- / 16
```
The port `8080` might be different as per project setting. Please read the `README.md` file inside each project to check the exact port number.
## What are we benchmarking
This is a simple webframework benchmark. All framework testbed accept HTTP GET request to `/` and respond with text `Hello World!`.
For comprehensive webframework benchmark, one should refer to https://www.techempower.com/benchmarks/
## Benchmark details
### [ActFramework](http://actframework.org)
```
luog@luog-Satellite-P50-A:~/p/greenlaw110/FrameworkBenchmarks/frameworks/Java/act$ wrk -t4 -c256 -d15s http://localhost:5460 -s pipeline.lua --latency -- / 16
Running 15s test @ http://localhost:5460
4 threads and 256 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 4.27ms 4.79ms 211.96ms 93.75%
Req/Sec 191.84k 36.57k 323.23k 62.50%
Latency Distribution
50% 3.71ms
75% 5.72ms
90% 7.80ms
99% 13.46ms
11466144 requests in 15.07s, 1.76GB read
Requests/sec: 761081.24
Transfer/sec: 119.76MB
```
### [AKKA-HTTP](http://doc.akka.io/docs/akka-stream-and-http-experimental/1.0-M2/scala/http/)
```
luog@luog-Satellite-P50-A:~/p/tmp/light-java-example/performance$ wrk -t4 -c128 -d30s http://localhost:8080 -s pipeline.lua --latency -- / 16
Running 30s test @ http://localhost:8080
4 threads and 128 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 26.26ms 128.23ms 1.83s 97.35%
Req/Sec 51.74k 11.87k 133.70k 87.02%
Latency Distribution
50% 5.65ms
75% 9.42ms
90% 17.70ms
99% 786.31ms
6034389 requests in 30.10s, 0.87GB read
Requests/sec: 200481.39
Transfer/sec: 29.64MB
```
### [Bootique + Jetty/Jersey](https://github.com/bootique/bootique-jersey)
```
luog@luog-Satellite-P50-A:~/p/greenlaw110/webframework-benchmark$ wrk -t4 -c128 -d30s http://localhost:8080 -s pipeline.lua --latency -- / 16
Running 30s test @ http://localhost:8080
4 threads and 128 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 50.39ms 61.17ms 730.72ms 85.85%
Req/Sec 20.72k 3.54k 38.29k 71.48%
Latency Distribution
50% 25.08ms
75% 69.40ms
90% 136.04ms
99% 273.06ms
2476508 requests in 30.06s, 425.12MB read
Requests/sec: 82373.78
Transfer/sec: 14.14MB
```
### [Dropwizard](http://www.dropwizard.io)
```
luog@luog-Satellite-P50-A:~/p/greenlaw110/webframework-benchmark$ wrk -t4 -c128 -d30s http://localhost:8080 -s pipeline.lua --latency -- / 16
Running 30s test @ http://localhost:8080
4 threads and 128 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 57.73ms 73.40ms 737.18ms 85.68%
Req/Sec 19.64k 4.22k 42.51k 71.30%
Latency Distribution
50% 25.43ms
75% 79.71ms
90% 162.27ms
99% 321.80ms
2350101 requests in 30.10s, 224.12MB read
Requests/sec: 78079.06
Transfer/sec: 7.45MB
```
### [Go-Fast-HTTP](https://github.com/valyala/fasthttp)
```
wrk -t4 -c128 -d30s http://localhost:8080 -s pipeline.lua --latency -- / 16
Running 30s test @ http://localhost:8080
4 threads and 128 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 0.94ms 1.14ms 41.94ms 90.79%
Req/Sec 474.64k 56.55k 646.95k 67.17%
Latency Distribution
50% 621.00us
75% 1.14ms
90% 1.98ms
99% 5.38ms
56820016 requests in 30.09s, 6.67GB read
Requests/sec: 1888432.99
Transfer/sec: 226.92MB
```
### [Go-http](https://golang.org/pkg/net/http/)
```
wrk -t4 -c128 -d30s http://localhost:8080 -s pipeline.lua --latency -- / 16
Running 30s test @ http://localhost:8080
4 threads and 128 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 7.02ms 6.43ms 89.62ms 86.83%
Req/Sec 60.70k 5.54k 94.08k 72.23%
Latency Distribution
50% 5.25ms
75% 9.02ms
90% 14.87ms
99% 31.30ms
7254992 requests in 30.04s, 0.87GB read
Requests/sec: 241484.14
Transfer/sec: 29.71MB
```
### [Iris (go)](http://iris-go.com/)
```
wrk -t4 -c128 -d30s http://localhost:8080 -s pipeline.lua --latency -- / 16
Running 30s test @ http://localhost:8080
4 threads and 128 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 11.25ms 10.62ms 128.91ms 86.35%
Req/Sec 42.69k 3.67k 56.17k 69.57%
Latency Distribution
50% 7.83ms
75% 15.23ms
90% 25.21ms
99% 49.84ms
5104910 requests in 30.05s, 628.03MB read
Requests/sec: 169879.19
Transfer/sec: 20.90MB
```
### [JFinal 3.0](http://www.jfinal.com/)
```
luog@luog-Satellite-P50-A:~/p/tmp/light-java-example/performance$ wrk -t4 -c128 -d30s http://localhost:8080 -s pipeline.lua --latency -- / 16
Running 30s test @ http://localhost:8080
4 threads and 128 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 8.93ms 12.67ms 171.84ms 92.07%
Req/Sec 57.81k 9.61k 103.15k 79.67%
Latency Distribution
50% 5.20ms
75% 9.44ms
90% 18.31ms
99% 71.59ms
6921586 requests in 30.10s, 1.44GB read
Requests/sec: 229960.41
Transfer/sec: 49.12MB
```
### [Jooby](http://jooby.org/)
```
luog@luog-Satellite-P50-A:~/p/tmp/light-java-example/performance$ wrk -t4 -c128 -d30s http://localhost:8080 -s pipeline.lua --latency -- / 16
Running 30s test @ http://localhost:8080
4 threads and 128 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 15.91ms 13.45ms 133.45ms 75.33%
Req/Sec 35.35k 3.46k 46.71k 69.42%
Latency Distribution
50% 12.45ms
75% 22.23ms
90% 34.20ms
99% 60.77ms
4221760 requests in 30.02s, 607.95MB read
Requests/sec: 140645.13
Transfer/sec: 20.25MB
```
### [light-java](https://networknt.github.io/light-java/)
```
luog@luog-Satellite-P50-A:~/p/tmp/light-java-example/performance$ wrk -t4 -c128 -d30s http://localhost:8080 -s pipeline.lua --latency -- / 16
Running 30s test @ http://localhost:8080
4 threads and 128 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.94ms 4.40ms 130.96ms 94.38%
Req/Sec 422.30k 88.35k 760.32k 79.40%
Latency Distribution
50% 804.00us
75% 1.90ms
90% 4.23ms
99% 17.76ms
50501984 requests in 30.09s, 4.99GB read
Requests/sec: 1678297.39
Transfer/sec: 169.66MB
```
### [msf4j](http://wso2.com/products/microservices-framework-for-java/)
```
luog@luog-Satellite-P50-A:~/p/tmp/light-java-example/performance$ wrk -t4 -c128 -d30s http://localhost:8080 -s pipeline.lua --latency -- / 16
Running 30s test @ http://localhost:8080
4 threads and 128 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 18.42ms 18.00ms 86.77ms 82.64%
Req/Sec 10.77k 3.10k 17.82k 83.33%
Latency Distribution
50% 11.81ms
75% 27.67ms
90% 45.60ms
99% 80.58ms
12875 requests in 30.05s, 1.13MB read
Socket errors: connect 0, read 270, write 0, timeout 0
Requests/sec: 428.52
Transfer/sec: 38.65KB
```
**Note** msf4j test cannot be completed due to huge number of error
```
2017-01-28 17:07:19 ERROR WorkerPoolDispatchingSourceHandler:127 - Error occurred inside the messaging engine
java.lang.NullPointerException
at org.wso2.msf4j.internal.MSF4JMessageProcessor.receive(MSF4JMessageProcessor.java:69)
at org.wso2.carbon.transport.http.netty.listener.WorkerPoolDispatchingSourceHandler.lambda$publishToWorkerPool$12(WorkerPoolDispatchingSourceHandler.java:125)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
```
While using `ab` to test with `-c` argument, it will halt. Looks like the server failed to release connection
### [Ninjaframework](http://www.ninjaframework.org/)
```
luog@luog-Satellite-P50-A:~/p/tmp/light-java-example/performance$ wrk -t4 -c128 -d30s http://localhost:8080 -s pipeline.lua --latency -- / 16
Running 30s test @ http://localhost:8080
4 threads and 128 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 27.55ms 18.56ms 169.72ms 66.95%
Req/Sec 13.08k 1.13k 40.77k 85.26%
Latency Distribution
50% 24.11ms
75% 39.00ms
90% 53.58ms
99% 80.25ms
1563624 requests in 30.10s, 445.87MB read
Requests/sec: 51948.21
Transfer/sec: 14.81MB
```
### [node-express](http://expressjs.com/)
```
luog@luog-Satellite-P50-A:~/p/tmp/light-java-example/performance$ wrk -t4 -c128 -d30s http://localhost:8080 -s pipeline.lua --latency -- / 16
Running 30s test @ http://localhost:8080
4 threads and 128 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 23.26ms 10.97ms 193.31ms 52.16%
Req/Sec 11.93k 577.06 13.40k 80.32%
Latency Distribution
50% 29.18ms
75% 39.91ms
90% 0.00us
99% 0.00us
1424427 requests in 30.03s, 312.44MB read
Requests/sec: 47429.61
Transfer/sec: 10.40MB
```
### [Payra-Micro](http://www.payara.fish/payara_micro)
```
luog@luog-Satellite-P50-A:~/p/tmp/light-java-example/performance$ wrk -t4 -c128 -d30s http://localhost:8080 -s pipeline.lua --latency -- / 16
Running 30s test @ http://localhost:8080
4 threads and 128 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 63.32ms 75.53ms 971.03ms 85.91%
Req/Sec 15.51k 2.29k 23.16k 69.57%
Latency Distribution
50% 32.43ms
75% 88.55ms
90% 167.47ms
99% 333.34ms
1856843 requests in 30.09s, 262.21MB read
Requests/sec: 61703.99
Transfer/sec: 8.71MB
```
### [Play-Java](http://playframework.com)
```
luog@luog-Satellite-P50-A:~/p/tmp/light-java-example/performance$ wrk -t4 -c128 -d30s http://localhost:8080 -s pipeline.lua --latency -- / 16
Running 30s test @ http://localhost:8080
4 threads and 128 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 13.90ms 14.89ms 186.20ms 86.63%
Req/Sec 54.89k 9.39k 121.86k 70.94%
Latency Distribution
50% 8.83ms
75% 19.19ms
90% 33.24ms
99% 67.94ms
6563656 requests in 30.10s, 807.49MB read
Requests/sec: 218074.28
Transfer/sec: 26.83MB
```
### [Playframework v1.4.x](http://playframework.com)
```
luog@luog-Satellite-P50-A:~/p/tmp/light-java-example/performance$ wrk -t4 -c128 -d30s http://localhost:9000 -s pipeline.lua --latency -- / 16
Running 30s test @ http://localhost:9000
4 threads and 128 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 22.42ms 11.35ms 70.70ms 58.37%
Req/Sec 12.61k 730.55 14.56k 75.75%
Latency Distribution
50% 22.14ms
75% 32.31ms
90% 37.47ms
99% 43.82ms
1505641 requests in 30.01s, 643.28MB read
Requests/sec: 50176.54
Transfer/sec: 21.44MB
```
### [RatPack](https://ratpack.io/)
```
Hello World!luog@luog-Satellite-P50-A:~/p/tmp/light-java-example/performance$ wrk -t4 -c128 -d30s http://localhost:5050 -s pipeline.lua --latency -- / 16
Running 30s test @ http://localhost:5050
4 threads and 128 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 8.44ms 8.48ms 99.56ms 86.67%
Req/Sec 60.85k 12.38k 115.96k 73.24%
Latency Distribution
50% 5.56ms
75% 11.37ms
90% 19.41ms
99% 40.10ms
7274698 requests in 30.09s, 631.33MB read
Requests/sec: 241775.80
Transfer/sec: 20.98MB
```
### [Sparkframework](http://sparkjava.com/)
```
luog@luog-Satellite-P50-A:~/p/tmp/light-java-example/performance$ wrk -t4 -c128 -d30s http://localhost:4567 -s pipeline.lua --latency -- / 16
Running 30s test @ http://localhost:4567
4 threads and 128 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 11.14ms 17.60ms 264.11ms 89.63%
Req/Sec 73.42k 10.34k 118.73k 71.06%
Latency Distribution
50% 4.55ms
75% 11.29ms
90% 29.61ms
99% 88.37ms
8786831 requests in 30.10s, 1.45GB read
Requests/sec: 291954.47
Transfer/sec: 49.28MB
```
### spring-boot-reactor
```
luog@luog-Satellite-P50-A:~/p/tmp/light-java-example/performance$ wrk -t4 -c128 -d30s http://localhost:3000 -s pipeline.lua --latency -- / 16
Running 30s test @ http://localhost:3000
4 threads and 128 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 4.17ms 3.99ms 57.24ms 87.97%
Req/Sec 96.64k 13.88k 185.06k 73.95%
Latency Distribution
50% 2.96ms
75% 5.22ms
90% 9.15ms
99% 19.43ms
11557468 requests in 30.08s, 848.70MB read
Requests/sec: 384186.78
Transfer/sec: 28.21MB
```
### spring-boot-undertow (undertow embedded)
```
Running 30s test @ http://localhost:8080
4 threads and 128 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 18.88ms 15.52ms 149.97ms 76.72%
Req/Sec 22.47k 2.10k 28.28k 75.33%
Latency Distribution
50% 14.52ms
75% 26.44ms
90% 39.97ms
99% 70.50ms
2684368 requests in 30.02s, 389.12MB read
Requests/sec: 89433.13
Transfer/sec: 12.96MB
```
### spring-boot-tomcat (tomcat embedded)
```
luog@luog-Satellite-P50-A:~/p/tmp/light-java-example/performance$ wrk -t4 -c128 -d30s http://localhost:8080 -s pipeline.lua --latency -- / 16
Running 30s test @ http://localhost:8080
4 threads and 128 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 42.84ms 58.42ms 794.35ms 87.61%
Req/Sec 17.23k 3.40k 25.03k 74.56%
Latency Distribution
50% 19.22ms
75% 50.19ms
90% 117.59ms
99% 272.61ms
2063347 requests in 30.10s, 248.31MB read
Requests/sec: 68554.49
Transfer/sec: 8.25MB
```
### [WildFly Swarm](http://wildfly-swarm.io/)
```
luog@luog-Satellite-P50-A:~/p/tmp/light-java-example/performance$ wrk -t4 -c128 -d30s http://localhost:8080 -s pipeline.lua --latency -- / 16
Running 30s test @ http://localhost:8080
4 threads and 128 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 20.08ms 11.37ms 143.50ms 64.97%
Req/Sec 14.63k 1.66k 22.76k 85.75%
Latency Distribution
50% 20.55ms
75% 29.25ms
90% 38.70ms
99% 0.00us
1749499 requests in 30.07s, 230.25MB read
Requests/sec: 58179.11
Transfer/sec: 7.66MB
```