You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
3.1 KiB
153 lines
3.1 KiB
#!/usr/bin/bash |
|
# This script can be invoked as follows: |
|
# |
|
# glibc-bench-compare [options] <BUILD> [BUILD] |
|
# |
|
# Options may be one of the following: |
|
# |
|
# -t The BUILD arguments are task ids and not a version-release string |
|
# -a ARCH Do comparison for ARCH architecture |
|
# |
|
# If any of the above options are given, both BUILD arguments must be given. |
|
# Otherwise, if only one BUILD is specified, then it is compared against the |
|
# installed glibc. |
|
|
|
# Silence the pushd/popd messages |
|
pushd() { |
|
command pushd "$@" > /dev/null 2>&1 |
|
} |
|
|
|
popd() { |
|
command popd "$@" > /dev/null 2>&1 |
|
} |
|
|
|
# Clean up any downloaded files before we exit |
|
trap "rm -rf /tmp/glibc-bench-compare.$BASHPID.*" EXIT |
|
|
|
task=0 |
|
arch=$(uname -i) |
|
options=0 |
|
path=0 |
|
installed= |
|
|
|
# Look for any commandline options |
|
while getopts ":tpa:" opt; do |
|
case $opt in |
|
p) |
|
path=1 |
|
;; |
|
t) |
|
task=1 |
|
options=1 |
|
echo "Not implemented." |
|
exit 1 |
|
;; |
|
a) |
|
arch=$OPTARG |
|
options=1 |
|
;; |
|
*) |
|
;; |
|
esac |
|
done |
|
|
|
# Done, now shift all option arguments out. |
|
shift $((OPTIND-1)) |
|
|
|
if [ $# -gt 2 ] || [ $# -eq 0 ] || [ $# -lt 2 -a $options -eq 1 ]; then |
|
echo "Usage: $0 [OPTIONS] <old> [new]" |
|
echo |
|
echo "OPTIONS:" |
|
echo -e "\t-t\tCompare two brew tasks" |
|
echo -e "\t-a ARCH\tGet rpms for the ARCH architecture" |
|
echo -e "\t-p\tCompare built rpms in two paths." |
|
echo -e "\t\tThis minimally needs glibc, glibc-common and glibc-benchtests" |
|
exit 1 |
|
fi |
|
|
|
if [ -z $2 ]; then |
|
new="$1" |
|
old=$(rpm --queryformat "%{VERSION}-%{RELEASE}\n" -q glibc | head -1) |
|
installed=$old |
|
else |
|
new="$2" |
|
old="$1" |
|
fi |
|
|
|
decompress_rpms() { |
|
# We were given a path to the rpms. Figure out the version-release and |
|
# decompress the rpms. |
|
if [ -n $1 ]; then |
|
vr=$(rpm --queryformat="%{VERSION}-%{RELEASE}" -qp $1/glibc-2*.rpm | head -1) |
|
mkdir $vr && pushd $vr |
|
fi |
|
|
|
for r in $1*.rpm; do |
|
( rpm2cpio $r | cpio -di ) > /dev/null |
|
done |
|
|
|
if [ -n $1 ]; then |
|
popd |
|
echo $vr |
|
fi |
|
} |
|
|
|
# Get rpms for a build and decompress them |
|
get_build() { |
|
echo "Processing build $1" |
|
mkdir $1 && pushd $1 |
|
brew buildinfo "glibc-$1" | |
|
sed -n -e "s|/mnt/koji\(.\+$arch.\+\)|http://kojipkgs.fedoraproject.org\1|p" | |
|
while read url; do |
|
echo "Downloading $url" |
|
wget -q $url |
|
done |
|
decompress_rpms |
|
|
|
echo "Removing rpms" |
|
rm -f $1/*.rpm |
|
|
|
popd |
|
} |
|
|
|
# Run benchmarks for a build |
|
run_bench() { |
|
if [ -z $1 ]; then |
|
make DETAILED=1 ver=$installed prefix= -f /usr/libexec/glibc-benchtests/bench.mk bench |
|
else |
|
make DETAILED=1 ver=$1 prefix=$PWD -f $1/usr/libexec/glibc-benchtests/bench.mk bench |
|
fi |
|
} |
|
|
|
# Get absolute paths if needed, since we will change into the working directory |
|
# next. |
|
if [ $path -eq 1 ]; then |
|
old_path=$(realpath $old)/ |
|
new_path=$(realpath $new)/ |
|
fi |
|
|
|
tmpdir=$(mktemp -p /tmp -d glibc-bench-compare.$$.XXXX) |
|
pushd $tmpdir |
|
|
|
# Get both builds. |
|
if [ $path -eq 0 ]; then |
|
if [ -z $installed ]; then |
|
get_build $old |
|
fi |
|
get_build $new |
|
else |
|
old=$(decompress_rpms $old_path) |
|
new=$(decompress_rpms $new_path) |
|
fi |
|
|
|
# make bench for each of those. |
|
if [ -z $installed ]; then |
|
run_bench $old |
|
else |
|
run_bench |
|
fi |
|
run_bench $new |
|
|
|
# Now run the comparison script. |
|
$old/usr/libexec/glibc-benchtests/compare_bench.py $old/usr/libexec/glibc-benchtests/benchout.schema.json \ |
|
bench.$old.out bench.$new.out
|
|
|