Coding Languages¶
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.
I used all of the following languages but neither do I currently use them on and on. See my Blog for where my programming activities are. Which of the languages to use depends on the project and its goals. For the time of writing my preferences are JavaScript for client and for server if development speed matters or Rust if stability and performance matters.
The Languages are parted into:
Markup and Templates¶
Scripting Languages¶
I use interpreted languages for fast solutions:
- Bash
- JavaScript
- TypeScript which is an optimization of JavaScript
- CoffeeScript
But then a project get's really big, it's attractive veneer quickly washes away.
Compiler Languages¶
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.
Other¶
- Regular Expressions that are some languages of itself.
Comparison¶
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.
Web server¶
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).
Apache 2.4
$ 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.