tiny_http 0.8.1

Low level HTTP server library
Documentation
#!/bin/bash

kill_child_processes() {
	isTopmost=$1
	curPid=$2
	childPids=`ps -o pid --no-headers --ppid ${curPid}`
	for childPid in $childPids
	do
		kill_child_processes 0 $childPid
	done
	if [ $isTopmost -eq 0 ]; then
		disown $curPid &> /dev/null
		kill -9 $curPid &> /dev/null
	fi
}

start_bench() {
	concurrency=$1
	num=50000

	# benchmarking nodejs
	echo "Benchmarking nodejs (concurrency: ${concurrency})"
	(node bench.js) & (sleep 1 ; exec ab -n ${num} -c ${concurrency} http://localhost:9615/ 2> /dev/null | grep "per second")

	# benchmarking tiny-http
	echo "Benchmarking tiny-http (concurrency: ${concurrency})"
	(./hello_world 1> /dev/null) & (sleep 1 ; exec ab -n ${num} -c ${concurrency} http://localhost:9975/ 2> /dev/null | grep "per second")

	# benchmarking apache2
	echo "Benchmarking apache2 (concurrency: ${concurrency})"
	exec ab -n ${num} -c ${concurrency} http://localhost/ 2> /dev/null | grep "per second"

	kill_child_processes 1 $$
}

# Ctrl-C trap. Catches INT signal
trap "kill_child_processes 1 $$; exit 0" INT

# building tiny-http
echo "Building tiny-http"
cargo build --release
rustc --opt-level=3 -Z lto -o hello_world -L target/release -L target/release/deps examples/hello-world.rs

# building nodejs app
echo "var http = require('http');" > bench.js
echo "http.createServer(function (req, res) {" >> bench.js
echo "  res.writeHead(200, {'Content-Type': 'text/plain'});" >> bench.js
echo "  res.end(\"hello world\");" >> bench.js
echo "}).listen(9615);" >> bench.js

# 
start_bench 1
start_bench 2
start_bench 4
start_bench 8
start_bench 16
start_bench 32
start_bench 64

# cleanup
kill_child_processes 1 $$