#!/bin/bash

set -eu
set -o pipefail

function get_time
{
    python3 -c 'import time; print(time.time())'
}

function subtract
{
    left="$1"
    right="$2"
    echo "$left - $right" | bc
}

for i in 10 100 1,000 10,000 100,000 1,000,000 # 10,000,000 100,000,000
do
    echo sieve cpython $i 1>&2
    time0=$(get_time)
    if ! output=$(set -eu; /usr/local/cpython-3.6/bin/python3 ./sieve $i 2>&1)
    then
        echo "Run failed:" 1>&2
        echo "$output" 1>&2
        exit 1
    else
        time1=$(get_time)
        # shellcheck disable=SC2046,SC2086
        echo $(subtract $time1 $time0) seconds
    fi
    
    echo sieve pypy $i 1>&2
    time0=$(get_time)
    if ! output=$(set -eu; ./sieve $i 2>&1)
    then
        echo "Run failed:" 1>&2
        echo "$output" 1>&2
        exit 1
    else
        time1=$(get_time)
        # shellcheck disable=SC2046,SC2086
        echo $(subtract $time1 $time0) seconds
    fi
    
    echo sieve nuitka3 $i 1>&2
    time0=$(get_time)
    if ! output=$(set -eu; ./sieve.exe $i 2>&1)
    then
        echo "Run failed:" 1>&2
        echo "$output" 1>&2
        exit 1
    else
        time1=$(get_time)
        # shellcheck disable=SC2046,SC2086
        echo $(subtract $time1 $time0) seconds
    fi
    
    echo sieve-mp micropython $i 1>&2
    time0=$(get_time)
    # If this segfaults, it's probably because heapsize is too big.
    if ! output=$(set -eu; /usr/local/micropython-git-2017-06-16/bin/micropython -X heapsize=4000M ./sieve-mp $i 2>&1)
    then
        echo "Run failed:" 1>&2
        echo "$output" 1>&2
        exit 1
    else
        time1=$(get_time)
        # shellcheck disable=SC2046,SC2086
        echo $(subtract $time1 $time0) seconds
    fi
   
    echo numpy-sieve $i 1>&2
    time0=$(get_time)
    if ! output=$(set -eu; ./numpy-sieve $i 2>&1)
    then
        echo "Run failed:" 1>&2
        echo "$output" 1>&2
        exit 1
    else
        time1=$(get_time)
        # shellcheck disable=SC2046,SC2086
        echo $(subtract $time1 $time0) seconds
    fi

    echo Sieve.java $i 1>&2
    time0=$(get_time)
    if ! output=$(set -eu; java Sieve $i 2>&1)
    then
        echo "Run failed:" 1>&2
        echo "$output" 1>&2
        exit 1
    else
        time1=$(get_time)
        # shellcheck disable=SC2046,SC2086
        echo $(subtract $time1 $time0) seconds
    fi

    echo 1>&2
done