1*5a6e8488SAndroid Build Coastguard Worker#! /bin/sh 2*5a6e8488SAndroid Build Coastguard Worker# 3*5a6e8488SAndroid Build Coastguard Worker# SPDX-License-Identifier: BSD-2-Clause 4*5a6e8488SAndroid Build Coastguard Worker# 5*5a6e8488SAndroid Build Coastguard Worker# Copyright (c) 2018-2024 Gavin D. Howard and contributors. 6*5a6e8488SAndroid Build Coastguard Worker# 7*5a6e8488SAndroid Build Coastguard Worker# Redistribution and use in source and binary forms, with or without 8*5a6e8488SAndroid Build Coastguard Worker# modification, are permitted provided that the following conditions are met: 9*5a6e8488SAndroid Build Coastguard Worker# 10*5a6e8488SAndroid Build Coastguard Worker# * Redistributions of source code must retain the above copyright notice, this 11*5a6e8488SAndroid Build Coastguard Worker# list of conditions and the following disclaimer. 12*5a6e8488SAndroid Build Coastguard Worker# 13*5a6e8488SAndroid Build Coastguard Worker# * Redistributions in binary form must reproduce the above copyright notice, 14*5a6e8488SAndroid Build Coastguard Worker# this list of conditions and the following disclaimer in the documentation 15*5a6e8488SAndroid Build Coastguard Worker# and/or other materials provided with the distribution. 16*5a6e8488SAndroid Build Coastguard Worker# 17*5a6e8488SAndroid Build Coastguard Worker# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18*5a6e8488SAndroid Build Coastguard Worker# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19*5a6e8488SAndroid Build Coastguard Worker# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20*5a6e8488SAndroid Build Coastguard Worker# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 21*5a6e8488SAndroid Build Coastguard Worker# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22*5a6e8488SAndroid Build Coastguard Worker# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23*5a6e8488SAndroid Build Coastguard Worker# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24*5a6e8488SAndroid Build Coastguard Worker# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25*5a6e8488SAndroid Build Coastguard Worker# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26*5a6e8488SAndroid Build Coastguard Worker# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27*5a6e8488SAndroid Build Coastguard Worker# POSSIBILITY OF SUCH DAMAGE. 28*5a6e8488SAndroid Build Coastguard Worker# 29*5a6e8488SAndroid Build Coastguard Worker 30*5a6e8488SAndroid Build Coastguard Worker# This script depends on the GNU time utility, but I am okay with that because 31*5a6e8488SAndroid Build Coastguard Worker# this script is only for maintainers. 32*5a6e8488SAndroid Build Coastguard Worker 33*5a6e8488SAndroid Build Coastguard Worker# Just print the usage and exit with an error. This can receive a message to 34*5a6e8488SAndroid Build Coastguard Worker# print. 35*5a6e8488SAndroid Build Coastguard Worker# @param 1 A message to print. 36*5a6e8488SAndroid Build Coastguard Workerusage() { 37*5a6e8488SAndroid Build Coastguard Worker if [ $# -eq 1 ]; then 38*5a6e8488SAndroid Build Coastguard Worker printf '%s\n\n' "$1" 39*5a6e8488SAndroid Build Coastguard Worker fi 40*5a6e8488SAndroid Build Coastguard Worker printf 'usage: %s [-n<runs>] [-p<pause>] dir benchmark...\n' "$0" 1>&2 41*5a6e8488SAndroid Build Coastguard Worker printf ' -d will delete the generated benchmark(s).\n' 42*5a6e8488SAndroid Build Coastguard Worker printf ' -n runs is how many runs to run the benchmark, default 10.\n' 43*5a6e8488SAndroid Build Coastguard Worker printf ' -p pause is how many seconds to pause before running the benchmarks.\n' 44*5a6e8488SAndroid Build Coastguard Worker printf '\n' 45*5a6e8488SAndroid Build Coastguard Worker printf 'The fields are put in this order:\n' 46*5a6e8488SAndroid Build Coastguard Worker printf '1. Elapsed Time\n' 47*5a6e8488SAndroid Build Coastguard Worker printf '2. System Time\n' 48*5a6e8488SAndroid Build Coastguard Worker printf '3. User Time\n' 49*5a6e8488SAndroid Build Coastguard Worker printf '4. Max RSS\n' 50*5a6e8488SAndroid Build Coastguard Worker printf '5. Average RSS\n' 51*5a6e8488SAndroid Build Coastguard Worker printf '6. Average Total Memory Use\n' 52*5a6e8488SAndroid Build Coastguard Worker printf '7. Average Unshared Data\n' 53*5a6e8488SAndroid Build Coastguard Worker printf '8. Average Unshared Stack\n' 54*5a6e8488SAndroid Build Coastguard Worker printf '9. Average Shared Text\n' 55*5a6e8488SAndroid Build Coastguard Worker printf '10. Major Page Faults\n' 56*5a6e8488SAndroid Build Coastguard Worker printf '11. Minor Page Faults\n' 57*5a6e8488SAndroid Build Coastguard Worker printf '12. Swaps\n' 58*5a6e8488SAndroid Build Coastguard Worker printf '13. Involuntary Context Switches\n' 59*5a6e8488SAndroid Build Coastguard Worker printf '14. Voluntary Context Switches\n' 60*5a6e8488SAndroid Build Coastguard Worker printf '15. Inputs\n' 61*5a6e8488SAndroid Build Coastguard Worker printf '16. Outputs\n' 62*5a6e8488SAndroid Build Coastguard Worker printf '17. Signals Delivered\n' 63*5a6e8488SAndroid Build Coastguard Worker exit 1 64*5a6e8488SAndroid Build Coastguard Worker} 65*5a6e8488SAndroid Build Coastguard Worker 66*5a6e8488SAndroid Build Coastguard Workerscript="$0" 67*5a6e8488SAndroid Build Coastguard Workerscriptdir=$(dirname "$script") 68*5a6e8488SAndroid Build Coastguard Worker 69*5a6e8488SAndroid Build Coastguard Worker. "$scriptdir/functions.sh" 70*5a6e8488SAndroid Build Coastguard Worker 71*5a6e8488SAndroid Build Coastguard Workerruns=10 72*5a6e8488SAndroid Build Coastguard Workerpause=0 73*5a6e8488SAndroid Build Coastguard Workerdelete=0 74*5a6e8488SAndroid Build Coastguard Worker 75*5a6e8488SAndroid Build Coastguard Worker# Process command-line arguments. 76*5a6e8488SAndroid Build Coastguard Workerwhile getopts "dn:p:" opt; do 77*5a6e8488SAndroid Build Coastguard Worker 78*5a6e8488SAndroid Build Coastguard Worker case "$opt" in 79*5a6e8488SAndroid Build Coastguard Worker d) delete=1 ;; 80*5a6e8488SAndroid Build Coastguard Worker n) runs="$OPTARG" ;; 81*5a6e8488SAndroid Build Coastguard Worker p) pause="$OPTARG" ;; 82*5a6e8488SAndroid Build Coastguard Worker ?) usage "Invalid option: $opt" ;; 83*5a6e8488SAndroid Build Coastguard Worker esac 84*5a6e8488SAndroid Build Coastguard Worker 85*5a6e8488SAndroid Build Coastguard Workerdone 86*5a6e8488SAndroid Build Coastguard Worker 87*5a6e8488SAndroid Build Coastguard Workerwhile [ "$#" -gt 0 ] && [ "$OPTIND" -gt 1 ]; do 88*5a6e8488SAndroid Build Coastguard Worker 89*5a6e8488SAndroid Build Coastguard Worker OPTIND=$(bin/bc -e "$OPTIND - 1") 90*5a6e8488SAndroid Build Coastguard Worker shift 91*5a6e8488SAndroid Build Coastguard Worker 92*5a6e8488SAndroid Build Coastguard Workerdone 93*5a6e8488SAndroid Build Coastguard Worker 94*5a6e8488SAndroid Build Coastguard Workerif [ "$#" -lt 2 ]; then 95*5a6e8488SAndroid Build Coastguard Worker usage "Not enough arguments" 96*5a6e8488SAndroid Build Coastguard Workerfi 97*5a6e8488SAndroid Build Coastguard Worker 98*5a6e8488SAndroid Build Coastguard Workercd "$scriptdir/.." 99*5a6e8488SAndroid Build Coastguard Worker 100*5a6e8488SAndroid Build Coastguard Workerd="$1" 101*5a6e8488SAndroid Build Coastguard Workershift 102*5a6e8488SAndroid Build Coastguard Workercheck_d_arg "$d" 103*5a6e8488SAndroid Build Coastguard Worker 104*5a6e8488SAndroid Build Coastguard Workerbenchmarks="" 105*5a6e8488SAndroid Build Coastguard Worker 106*5a6e8488SAndroid Build Coastguard Worker# Create the list of benchmarks from the arguments. 107*5a6e8488SAndroid Build Coastguard Workerwhile [ "$#" -gt 0 ]; do 108*5a6e8488SAndroid Build Coastguard Worker 109*5a6e8488SAndroid Build Coastguard Worker if [ "$benchmarks" = "" ]; then 110*5a6e8488SAndroid Build Coastguard Worker benchmarks="$1" 111*5a6e8488SAndroid Build Coastguard Worker else 112*5a6e8488SAndroid Build Coastguard Worker benchmarks="$benchmarks $1" 113*5a6e8488SAndroid Build Coastguard Worker fi 114*5a6e8488SAndroid Build Coastguard Worker 115*5a6e8488SAndroid Build Coastguard Worker shift 116*5a6e8488SAndroid Build Coastguard Workerdone 117*5a6e8488SAndroid Build Coastguard Worker 118*5a6e8488SAndroid Build Coastguard Workerfiles="" 119*5a6e8488SAndroid Build Coastguard Worker 120*5a6e8488SAndroid Build Coastguard Worker# Create the list of files from the benchmarks. 121*5a6e8488SAndroid Build Coastguard Workerfor b in $benchmarks; do 122*5a6e8488SAndroid Build Coastguard Worker 123*5a6e8488SAndroid Build Coastguard Worker f=$(printf "benchmarks/%s/%s.txt" "$d" "$b") 124*5a6e8488SAndroid Build Coastguard Worker 125*5a6e8488SAndroid Build Coastguard Worker if [ "$files" = "" ]; then 126*5a6e8488SAndroid Build Coastguard Worker files="$f" 127*5a6e8488SAndroid Build Coastguard Worker else 128*5a6e8488SAndroid Build Coastguard Worker files="$files $f" 129*5a6e8488SAndroid Build Coastguard Worker fi 130*5a6e8488SAndroid Build Coastguard Worker 131*5a6e8488SAndroid Build Coastguard Workerdone 132*5a6e8488SAndroid Build Coastguard Worker 133*5a6e8488SAndroid Build Coastguard Workerif [ "$d" = "bc" ]; then 134*5a6e8488SAndroid Build Coastguard Worker opts="-lq" 135*5a6e8488SAndroid Build Coastguard Worker halt="halt" 136*5a6e8488SAndroid Build Coastguard Workerelse 137*5a6e8488SAndroid Build Coastguard Worker opts="-x" 138*5a6e8488SAndroid Build Coastguard Worker halt="q" 139*5a6e8488SAndroid Build Coastguard Workerfi 140*5a6e8488SAndroid Build Coastguard Worker 141*5a6e8488SAndroid Build Coastguard Worker# Generate all of the benchmarks. 142*5a6e8488SAndroid Build Coastguard Workerfor b in $benchmarks; do 143*5a6e8488SAndroid Build Coastguard Worker 144*5a6e8488SAndroid Build Coastguard Worker if [ "$delete" -ne 0 ] || [ ! -f "./benchmarks/$d/$b.txt" ]; then 145*5a6e8488SAndroid Build Coastguard Worker printf 'Benchmarking generation of benchmarks/%s/%s.txt...\n' "$d" "$b" >&2 146*5a6e8488SAndroid Build Coastguard Worker printf '%s\n' "$halt" | /usr/bin/time -v bin/$d $opts "./benchmarks/$d/$b.$d" \ 147*5a6e8488SAndroid Build Coastguard Worker > "./benchmarks/$d/$b.txt" 148*5a6e8488SAndroid Build Coastguard Worker fi 149*5a6e8488SAndroid Build Coastguard Worker 150*5a6e8488SAndroid Build Coastguard Workerdone 151*5a6e8488SAndroid Build Coastguard Worker 152*5a6e8488SAndroid Build Coastguard Worker# We use this format to make things easier to use with ministat. 153*5a6e8488SAndroid Build Coastguard Workerformat="%e %S %U %M %t %K %D %p %X %F %R %W %c %w %I %O %k" 154*5a6e8488SAndroid Build Coastguard Worker 155*5a6e8488SAndroid Build Coastguard Workerprintf 'Benchmarking %s...\n' "$files" >&2 156*5a6e8488SAndroid Build Coastguard Worker 157*5a6e8488SAndroid Build Coastguard Workerif [ "$pause" -gt 0 ]; then 158*5a6e8488SAndroid Build Coastguard Worker sleep "$pause" 159*5a6e8488SAndroid Build Coastguard Workerfi 160*5a6e8488SAndroid Build Coastguard Worker 161*5a6e8488SAndroid Build Coastguard Workeri=0 162*5a6e8488SAndroid Build Coastguard Worker 163*5a6e8488SAndroid Build Coastguard Worker# Run the benchmarks as many times as told to. 164*5a6e8488SAndroid Build Coastguard Workerwhile [ "$i" -lt "$runs" ]; do 165*5a6e8488SAndroid Build Coastguard Worker 166*5a6e8488SAndroid Build Coastguard Worker printf '%s\n' "$halt" | /usr/bin/time -f "$format" bin/$d $opts $files 2>&1 > /dev/null 167*5a6e8488SAndroid Build Coastguard Worker 168*5a6e8488SAndroid Build Coastguard Worker # Might as well use the existing bc. 169*5a6e8488SAndroid Build Coastguard Worker i=$(printf '%s + 1\n' "$i" | bin/bc) 170*5a6e8488SAndroid Build Coastguard Worker 171*5a6e8488SAndroid Build Coastguard Workerdone 172