45c1cbdfd5
- Introduce SourceT, which is simple variant of "correct `ListT`". There are another variants possible (like in `streaming`), but I'm not sure there's much real difference. - Introduce `Codensity`. There's a flag if people don't want to depend on `kan-extensions`. - `StreamGenerator` and `ResultStream` are both `SourceT`. `Stream` combinator in `servant-client` uses `Codensity` for CPS. - Add servant-machines, servant-conduit, servant-pipes - Add streaming cookbook: just code, no explanations. - Add a script to run streaming 'benchmarks'
268 lines
6.4 KiB
Bash
268 lines
6.4 KiB
Bash
#!/bin/sh
|
|
|
|
set -e
|
|
|
|
SIZE=10000000
|
|
SLOWURL="http://localhost:8000/slow/2"
|
|
FASTURL="http://localhost:8000/get/$SIZE"
|
|
PROXYURL="http://localhost:8000/proxy"
|
|
|
|
# we use binary, as there's some size
|
|
TESTFILE="$(cabal-plan list-bin servant-machines:test:example)"
|
|
TMPFILE="$(mktemp)"
|
|
|
|
CURLSTATS="time: %{time_total}, size: %{size_download}, download speed: %{speed_download}\n"
|
|
|
|
# cleanup
|
|
|
|
cleanup() {
|
|
if [ ! -z "$MACHINES_PID" ]; then
|
|
kill "$MACHINES_PID" || true
|
|
fi
|
|
|
|
if [ ! -z "$CONDUIT_PID" ]; then
|
|
kill "$CONDUIT_PID" || true
|
|
fi
|
|
|
|
if [ ! -z "$PIPES_PID" ]; then
|
|
kill "$PIPES_PID" || true
|
|
fi
|
|
|
|
if [ ! -z "$COOKBOOK_PID" ]; then
|
|
kill "$COOKBOOK_PID" || true
|
|
fi
|
|
|
|
rm -f "$TMPFILE"
|
|
}
|
|
|
|
trap cleanup EXIT
|
|
|
|
bench() {
|
|
echo "\e[36m=== $1 ===\e[0m"
|
|
}
|
|
|
|
# Server
|
|
#######################################################################
|
|
|
|
## Machines
|
|
|
|
bench "server machines"
|
|
|
|
$(cabal-plan list-bin servant-machines:test:example) server +RTS -sbench-machines-server-rts.txt &
|
|
MACHINES_PID=$!
|
|
echo "Starting servant-machines server. PID=$MACHINES_PID"
|
|
|
|
# Time to startup
|
|
sleep 1
|
|
|
|
# Run slow url to test & warm-up server
|
|
curl "$SLOWURL"
|
|
|
|
curl --silent --show-error "$FASTURL" --output /dev/null --write-out "$CURLSTATS" > bench-machines-server.txt
|
|
|
|
curl --silent --show-error "$PROXYURL" --request POST --data-binary @"$TESTFILE" --output "$TMPFILE" --write-out "$CURLSTATS" > bench-machines-server-proxy.txt
|
|
|
|
kill -INT $MACHINES_PID
|
|
unset MACHINES_PID
|
|
|
|
## Pipes
|
|
|
|
bench "server pipes"
|
|
|
|
$(cabal-plan list-bin servant-pipes:test:example) server +RTS -sbench-pipes-server-rts.txt &
|
|
PIPES_PID=$!
|
|
echo "Starting servant-pipes server. PID=$PIPES_PID"
|
|
|
|
# Time to startup
|
|
sleep 1
|
|
|
|
# Run slow url to test & warm-up server
|
|
curl "$SLOWURL"
|
|
|
|
curl --silent --show-error "$FASTURL" --output /dev/null --write-out "$CURLSTATS" > bench-pipes-server.txt
|
|
|
|
curl --silent --show-error "$PROXYURL" --request POST --data-binary @"$TESTFILE" --output "$TMPFILE" --write-out "$CURLSTATS" > bench-pipes-server-proxy.txt
|
|
|
|
kill -INT $PIPES_PID
|
|
unset PIPES_PID
|
|
|
|
## Cookbook
|
|
|
|
bench "server cookbook"
|
|
|
|
$(cabal-plan list-bin cookbook-basic-streaming) server +RTS -sbench-cookbook-server-rts.txt &
|
|
COOKBOOK_PID=$!
|
|
echo "Starting servant-cookbook server. PID=$COOKBOOK_PID"
|
|
|
|
# Time to startup
|
|
sleep 1
|
|
|
|
# Run slow url to test & warm-up server
|
|
curl "$SLOWURL"
|
|
|
|
curl --silent --show-error "$FASTURL" --output /dev/null --write-out "$CURLSTATS" > bench-cookbook-server.txt
|
|
|
|
curl --silent --show-error "$PROXYURL" --request POST --data-binary @"$TESTFILE" --output "$TMPFILE" --write-out "$CURLSTATS" > bench-cookbook-server-proxy.txt
|
|
|
|
kill -INT $COOKBOOK_PID
|
|
unset COOKBOOK_PID
|
|
|
|
## Conduit
|
|
|
|
bench "server conduit"
|
|
|
|
$(cabal-plan list-bin servant-conduit:test:example) server +RTS -sbench-conduit-server-rts.txt &
|
|
CONDUIT_PID=$!
|
|
echo "Starting servant-conduit server. PID=$CONDUIT_PID"
|
|
|
|
# Time to startup
|
|
sleep 1
|
|
|
|
# Run slow url to test & warm-up server
|
|
curl "$SLOWURL"
|
|
|
|
curl --silent --show-error "$FASTURL" --output /dev/null --write-out "$CURLSTATS" > bench-conduit-server.txt
|
|
|
|
curl --silent --show-error "$PROXYURL" --request POST --data-binary @"$TESTFILE" --output "$TMPFILE" --write-out "$CURLSTATS" > bench-conduit-server-proxy.txt
|
|
|
|
# kill -INT $CONDUIT_PID
|
|
# unset CONDUIT_PID
|
|
|
|
# Client
|
|
#######################################################################
|
|
|
|
# Uses conduit as server
|
|
|
|
## Machines
|
|
|
|
bench "client machines"
|
|
|
|
# Test run
|
|
$(cabal-plan list-bin servant-machines:test:example) client 10
|
|
|
|
# Real run
|
|
/usr/bin/time --verbose --output bench-machines-client-time.txt \
|
|
"$(cabal-plan list-bin servant-machines:test:example)" client "$SIZE" +RTS -sbench-machines-client-rts.txt
|
|
|
|
## Pipes
|
|
|
|
bench "server pipes"
|
|
|
|
# Test run
|
|
$(cabal-plan list-bin servant-pipes:test:example) client 10
|
|
|
|
# Real run
|
|
/usr/bin/time --verbose --output bench-pipes-client-time.txt \
|
|
"$(cabal-plan list-bin servant-pipes:test:example)" client "$SIZE" +RTS -sbench-pipes-client-rts.txt
|
|
|
|
## Conduit
|
|
|
|
bench "client conduit"
|
|
|
|
# Test run
|
|
$(cabal-plan list-bin servant-conduit:test:example) client 10
|
|
|
|
# Real run
|
|
/usr/bin/time --verbose --output bench-conduit-client-time.txt \
|
|
"$(cabal-plan list-bin servant-conduit:test:example)" client "$SIZE" +RTS -sbench-conduit-client-rts.txt
|
|
|
|
## Cookbook
|
|
|
|
bench "server cookbook"
|
|
|
|
# Test run
|
|
$(cabal-plan list-bin cookbook-basic-streaming) client 10
|
|
|
|
# Real run
|
|
/usr/bin/time --verbose --output bench-cookbook-client-time.txt \
|
|
"$(cabal-plan list-bin cookbook-basic-streaming)" client "$SIZE" +RTS -sbench-cookbook-client-rts.txt
|
|
|
|
## Kill server
|
|
|
|
kill -INT $CONDUIT_PID
|
|
unset CONDUIT_PID
|
|
sleep 1
|
|
|
|
# Exit
|
|
#######################################################################
|
|
|
|
header() {
|
|
{ echo "$1 $2";
|
|
echo ""
|
|
} >> bench.md
|
|
}
|
|
|
|
report() {
|
|
echo "\`\`\`" >> bench.md
|
|
cat "$1" >> bench.md
|
|
echo "\`\`\`" >> bench.md
|
|
echo "" >> bench.md
|
|
}
|
|
|
|
report2() {
|
|
echo "\`\`\`" >> bench.md
|
|
cat "$1" | sed 's/^\s*//' >> bench.md
|
|
echo "\`\`\`" >> bench.md
|
|
echo "" >> bench.md
|
|
}
|
|
|
|
note() {
|
|
echo "$1" >> bench.md
|
|
echo "" >> bench.md
|
|
}
|
|
|
|
rm -f bench.md
|
|
|
|
header "#" "Streaming test benchmark"
|
|
note "size parameter: $SIZE"
|
|
|
|
header "##" Server
|
|
|
|
note "- /fast/$SIZE\n- /proxy"
|
|
|
|
header "###" machines
|
|
report bench-machines-server.txt
|
|
report bench-machines-server-proxy.txt
|
|
report bench-machines-server-rts.txt
|
|
|
|
header "###" pipes
|
|
report bench-pipes-server.txt
|
|
report bench-pipes-server-proxy.txt
|
|
report bench-pipes-server-rts.txt
|
|
|
|
header "###" conduit
|
|
note "Conduit server is also used for client tests below"
|
|
report bench-conduit-server.txt
|
|
report bench-conduit-server-proxy.txt
|
|
report bench-conduit-server-rts.txt
|
|
|
|
header "###" cookbook
|
|
report bench-cookbook-server.txt
|
|
report bench-cookbook-server-proxy.txt
|
|
report bench-cookbook-server-rts.txt
|
|
|
|
header "##" Client
|
|
|
|
header "###" machines
|
|
report2 bench-machines-client-time.txt
|
|
report bench-machines-client-rts.txt
|
|
|
|
header "###" pipes
|
|
report2 bench-pipes-client-time.txt
|
|
report bench-pipes-client-rts.txt
|
|
|
|
header "###" conduit
|
|
report2 bench-conduit-client-time.txt
|
|
report bench-conduit-client-rts.txt
|
|
|
|
header "###" cookbook
|
|
report2 bench-cookbook-client-time.txt
|
|
report bench-cookbook-client-rts.txt
|
|
|
|
# Cleanup filepaths
|
|
sed -E -i 's/\/[^ ]*machines[^ ]*\/example/...machines:example/' bench.md
|
|
sed -E -i 's/\/[^ ]*conduit[^ ]*\/example/...conduit:example/' bench.md
|
|
sed -E -i 's/\/[^ ]*pipes[^ ]*\/example/...pipes:example/' bench.md
|
|
sed -E -i 's/\/[^ ]*\/cookbook-basic-streaming/...cookbook-basic-streaming/' bench.md
|
|
|
|
sleep 3
|