This part will work as an introduction to each of the used languages. It gives you a short introduction but to fully understand the language you should also read the referenced documents and try it out some days.
The Languages are parted into:
Markup and Templates¶
I use interpreted languages for fast solutions:
But then a project get's really big, it's attractive veneer quickly washes away.
Here the compiler languages are coming back:
You need more time to write code but it comes out as more robust and production ready solutions.
Java is missing here completely while I know it and also made a big project with it I believe that this language is neither the best solution. Often such applications need a lot of resources, are not really fast and often a nightmare to find problems with
NullPointerException within. It's not generally this way but the code I had to manage tends this way.
- Regular Expressions that are some languages of itself.
Keep in mind that comparisons are always wrong because they only look at one very specific setup. But they may show some differences in technology.
As I want to work on a web project which needs a stable and fast web server I made an application serving a static HTML file in different languages. I did not program everything on my own but used the most popular and stable modules for all languages.
As a result I compare them against a plain Apache 2.4 installation. To make it comparable all serve the same very simple HTML file which they will found in their base directory.
I did run all three directly after each other on the same machine (i7 4CPU Cores, 8GB RAM).
$ wrk -t4 -c400 -d30s http://127.0.0.1 Running 30s test @ http://127.0.0.1 4 threads and 400 connections Thread Stats Avg Stdev Max +/- Stdev Latency 3.14ms 10.29ms 346.49ms 98.67% Req/Sec 3.51k 2.97k 13.96k 63.27% 363271 requests in 30.04s, 115.78MB read Requests/sec: 12094.09 Transfer/sec: 3.85MB load average: 8,36, 4,16, 2,35
Go using net/http
$ wrk -t4 -c400 -d30s http://127.0.0.1:8080 Running 30s test @ http://127.0.0.1:8080 4 threads and 400 connections Thread Stats Avg Stdev Max +/- Stdev Latency 24.62ms 42.73ms 634.52ms 89.12% Req/Sec 12.86k 3.38k 25.59k 75.25% 1537844 requests in 30.09s, 393.03MB read Non-2xx or 3xx responses: 467 Requests/sec: 51104.56 Transfer/sec: 13.06MB load average: 4,69, 3,83, 2,37
Rust using Iron
$ wrk -t4 -c400 -d30s http://127.0.0.1:8080 Running 30s test @ http://127.0.0.1:8080 4 threads and 400 connections Thread Stats Avg Stdev Max +/- Stdev Latency 406.52us 463.76us 72.85ms 95.36% Req/Sec 39.20k 36.83k 78.90k 55.17% 2340369 requests in 30.06s, 412.91MB read Requests/sec: 77864.45 Transfer/sec: 13.74MB load average: 14,28, 6,16, 3,25
NodeJS using http-server
Running 30s test @ http://127.0.0.1:8080 4 threads and 400 connections Thread Stats Avg Stdev Max +/- Stdev Latency 67.42ms 12.20ms 300.07ms 74.27% Req/Sec 1.47k 417.43 2.02k 45.78% 174900 requests in 30.05s, 56.04MB read Requests/sec: 5820.36 Transfer/sec: 1.87MB load average: 1.41 0.93 0.97
Apache did a low number of requests, Go was about 4 times faster but failed for some requests. The most requests were answered by Rust with no errors. Also the latency was very low but the system on full load. NodeJS as scripting language got the lowest number of request per sec but working only on one CPU it should also be better than apache if 4 cores will be used in a cluster mode. But the system load was the lowest, too.
So if performance matters Rust is the best to go but if only the pure static delivery is needed Nginx & Co should be checked against an own implementation.
See a complete web server benchmarking.