# compute average of a given field extract_fields() { typeset field="$1" awk ' /^'$field': /{ name=$1; wallclock=$4; usr=$8; sys=$10; cusr=$13; csys=$15; CPU=$18; print name" "wallclock" "usr" "sys" "cusr" "csys" "CPU }' } average() { typeset field="$1" extract_fields $field | awk ' BEGIN { max_wallclock=0; average_wallclock=0; average_usr=0; average_sys=0; average_cusr=0; average_csys=0; average_CPU=0 count=0 } { name=$1; wallclock=$2; usr=$3; sys=$4; cusr=$5; csys=$6; CPU=$7; if (wallclock > max_wallclock) max_wallclock = wallclock; average_wallclock+=wallclock; average_usr+=usr; average_sys+=sys; average_cusr+=cusr; average_csys+=csys; average_CPU+=CPU; count+=1 } END { if (count > 1) { average_wallclock -= max_wallclock; max_count=count-1; } else max_count=count; print name" Total time: "average_wallclock/max_count" wallclock secs ( "average_usr/count" usr "average_sys/count" sys + "average_cusr/count" cusr "average_csys/count" csys = "average_CPU/count" CPU)" }' } # compute adjusted average, ignoring too far values adjusted_average() { typeset field="$1" extract_fields $field | awk -v real_name=$2 -v real_wallclock=$3 -v real_usr=$4 -v real_sys=$5 \ -v real_cusr=$6 -v real_csys=$7 -v real_CPU=$8 ' function abs(value) { if (value < 0) return -value; else return value; } BEGIN { average_wallclock=0; average_sys=0; average_usr=0; average_csys=0; average_cusr=0; average_CPU=0 count=0 } { name=$1; wallclock=$2; usr=$3; sys=$4; cusr=$5; csys=$6; CPU=$7; if ( abs(wallclock - real_wallclock) > real_wallclock / 5 ) { printf "IGNORED: %s %f\n",name,real > "/dev/stderr" next; } average_wallclock+=wallclock; average_usr+=usr; average_sys+=sys; average_cusr+=cusr; average_csys+=csys; average_CPU+=CPU; count+=1 } END { print name" Total time: "average_wallclock/count" wallclock secs ( "average_usr/count" usr "average_sys/count" sys + "average_cusr/count" cusr "average_csys/count" csys = "average_CPU/count" CPU)" }' }