#!/bin/bash # USAGE: ./performance_test # This script needs JACK to be started or just starts it itself if it isn't. test_dir=$(dirname $0) cd $test_dir dg_path="../../drumgizmo" sample_interval=.5 cpu_plot_file="cpu_plot" ram_plot_file="ram_plot" cpu_data_file="cpu_data.dat" ram_data_file="ram_data.dat" dg_log_file="drumgizmo.log" # check for right number of parameters if [[ $# != 3 ]] then echo "ERROR: You didn't supply the right number of parameters." echo "USAGE: ./performance_test " echo "Exiting..." exit fi kit="$1" midimap="$2" midifile="$3" # function to check for dependencies function check_for_deps { for dep in "$@" do if ! command -v $dep >/dev/null 2>&1 then echo "ERROR: Cannot find ${dep}. Maybe it isn't installed?" echo "Exiting..." exit fi done } # check for drumgizmo if ! [ -e $dg_path/drumgizmo ] then echo "ERROR: The drumgizmo binary doesn't exist. Maybe you forgot to compile?" echo "Exiting..." exit fi # check for dependencies check_for_deps gnuplot top awk # check for the existence of the passed files if ! [ -e "$1" ] || ! [ -e "$2" ] || ! [ -e "$3" ] then echo "ERROR: One of the files (kit/midimap/midfile) doesn't exist." echo "Exiting..." exit fi echo "============================" echo "Starting the performace test" echo "============================" echo # initial data values cpu_data="" ram_data="" avg_cpu_usage="" time_elapsed=0 # log ram and cpu usage of process function logData { # returns the (zero-indexed) position of $word in $line. # returns -1 if $word isn't contained in $line. function get_position { word="$1" line=($2) count=0 for w in "${line[@]}" do if [ "$w" == "$word" ] then echo "$count" return fi count=$(($count+1)) done echo "-1" } pid=$1 top_output_labels="$(top -b -n 1 -p $pid | grep "^[ ]*PID")" top_output_values="$(top -b -n 1 -p $pid | grep "^[ ]*$pid")" if [ "$top_output_values" != "" ] then top_arr=($top_output_values) cpu_pos=$(get_position "%CPU" "$top_output_labels") ram_pos=$(get_position "%MEM" "$top_output_labels") if [ "$cpu_pos" == "-1" ] || [ "$ram_pos" == "-1" ] then echo "The top output doesn't look like expected." echo "Exiting..." exit fi cpu_usage="${top_arr[$cpu_pos]}" ram_usage="${top_arr[$ram_pos]}" cpu_data="${cpu_data}${time_elapsed} ${cpu_usage}\n" ram_data="${ram_data}${time_elapsed} ${ram_usage}\n" fi avg_cpu_usage_candidate="$(ps -p $pid -o %cpu | grep "^[ ]*[0-9][0-9]*")" # to make sure the process was still running when we executed the last command if [ avg_cpu_usage_candidate != "" ]; then avg_cpu_usage=$avg_cpu_usage_candidate; fi # hack to allow for float addition in the bash time_elapsed="$(awk "BEGIN {print $time_elapsed+$sample_interval; exit}")" } # gnuplot ram and cpu usage over time function plotData { echo -e "$cpu_data" > $cpu_data_file echo -e "$ram_data" > $ram_data_file gnuplot performance_test.gnuplot > /dev/null 2>&1 } # start dg echo "The terminal output of drumgizmo is routed to ${dg_log_file}" $dg_path/./drumgizmo -i midifile -I file="$midifile",midimap="$midimap" -o jackaudio "$kit" > $dg_log_file 2>&1 & pid=$! # collect data while dg is running echo "Collecting the data now. That might take a while..." while ps -p $pid > /dev/null do logData $pid sleep $sample_interval done # plot data plotData echo echo "-------------------------------------------------------------------" echo "The average CPU usage was: ${avg_cpu_usage}%" echo "See the data files $cpu_data_file and $ram_data_file for details." echo "They are nicely plotted in cpu_data.png and ram_data.png." echo "-------------------------------------------------------------------" echo echo "============================" echo "Finished the performace test" echo "============================"