-
Notifications
You must be signed in to change notification settings - Fork 56
Bash sample code: Create a speed test
Jean-Michel Gigault edited this page Aug 11, 2015
·
9 revisions
42FileChecker features a speedtest for comparing two programs, here is how it works! (Note: This is not a reliable test)
# This function executes a command and returns the number of ouputted lines
# Returns -1 if the program has failed or terminated in less than $TIMEOUT
function speedtest_exec_command
{
local COMMAND=$1 # The program to execute
local TIMEOUT=30 # Duration of execution of the test
local LOGFILE=.tmp_speedtest # Temporary file to save outputs
local TOTAL # Value to return
# Execute, redirect outputs, send it to background and get PID
($COMMAND 1>$LOGFILE 2>&1) &
local PID=$!
# Wait for the duration and check if the process is still running
sleep $TIMEOUT
if [ ! -z "$(ps a | awk '{print $1}' | grep $PID)" ]
then
# If yes, stop the process...
kill $PID
wait $! 2>/dev/null
# ...and count the number of lines written in the temporary file
TOTAL=$(cat $LOGFILE | wc -l | sed 's/[^0-9]*//g')
else
# If not, the program has failed running the minimum duration
TOTAL=-1
fi
rm -f $LOGFILE # Remove the temporary file
printf "%d" "$TOTAL" # and print the returned value $TOTAL
}
# This is the main function that takes 3 arguments:
# - The name of the Student's program
# - The name of the original Unix program
# - The arguments to pass to each program on execution
function speedtest
{
local PROG1=$1
local PROG2=$2
local ARGUMENTS=$3
# Call the 'speedtest_exec_command' with the 1st program
# and save the result in a variable $RET1
echo "RUNNING: '$PROG1 $ARGUMENTS'"
local RET1=`speedtest_exec_command "$PROG1 $ARGUMENTS"`
echo "Total of lines: $RET1"
# Call the 'speedtest_exec_command' with the 2nd program
# and save the result in a variable $RET2
echo "RUNNING: '$PROG2 $ARGUMENTS'"
local RET2=`speedtest_exec_command "$PROG2 $ARGUMENTS"`
echo "Total of lines: $RET2"
# Calculate the ratio between $RET1 and $RET2 and print it
local RATIO
(( RATIO = $RET1 * 100 / $RET2 ))
echo "\nRatio: $RATIO%"
}
# Call the speedtest (e.g: compare 'ft_ls' and 'ls')
speedtest "ft_ls" "ls" "-1R /"declare LOGFILE_STDOUT=.standard_output
declare LOGFILE_STDERR=.standard_error
# Redirect STDOUT and STDERR to distinct files
cat * 1>$LOGFILE_STDOUT 2>$LOGFILE_STDERR
declare LOGFILE=.outputs
# Redirect STDOUT and STDERR to the same file
cat * 1>$LOGFILE 2>&1 # '&1' means 'to where the stream #1 is going'
cat * 2>$LOGFILE 1>&2 # The same result but inverted
cat * 2>&1 1>$LOGFILE # Invalid order of redirections!declare FILENAME=42FileChecker.sh
cat $FILENAME # Read the file
cat $FILENAME | wc -l # Display the number of lines
cat $FILENAME | wc -l | sed 's/[^0-9]*//g' # Keep only the numeric value
# Now save the result in a numeric variable $TOTAL
declare -i TOTAL
TOTAL=$(cat $FILENAME | wc -l | sed 's/[^0-9]*//g')
echo "Number of lines: $TOTAL"function print_something
{
printf "%s" "$1"
}
declare RETURN
RETURN=$(print_something "This is an argument")
RETURN=`print_something "This is an argument"`Introduction:
- What is Bash
- What is a bash script
- What is 42FileChecker
- Contributing to 42FileChecker
Bash syntax:
Bash tools:
- Builtin commands
- Awk
- Cat
- Grep
- Sed
Bash sample codes:
- Script auto-update (git tool)
- Create an interactive menu
- Animated spinner with a time out
- Static var test
- Check the basic rules of a makefile
- Forbidden functions test
- Memory leak test script
- Create a speed test