Blame contrib/psota-benchmark/tcp.sh

Packit 08bd4c
#!/bin/sh
Packit 08bd4c
# tar comparison program
Packit 08bd4c
# 2007-10-25 Jan Psota
Packit 08bd4c
Packit 08bd4c
n=3                                     # number of repetitions
Packit 08bd4c
TAR="bsdtar gnutar star"                # Tape archivers to compare
Packit 08bd4c
OPT=("" "--seek" "-no-fsync")
Packit 08bd4c
pax="--format=pax"                      # comment out for defaults
Packit 08bd4c
OPN=(create list extract compare)       # operations
Packit 08bd4c
version="2007-10-25"
Packit 08bd4c
TIMEFORMAT=$'%R\t%U\t%S\t%P'
Packit 08bd4c
LC_ALL=C
Packit 08bd4c
Packit 08bd4c
test $# -ge 2 || {
Packit 08bd4c
        echo -e "usage:\t$0 source_dir where_to_place_archive 
Packit 08bd4c
[where_to_extract_it]
Packit 08bd4c
Packit 08bd4c
TCP, version $version
Packit 08bd4c
TCP stands for Tar Comparison Program here.
Packit 08bd4c
It currently compares: BSD tar (bsdtar), GNU tar (gnutar) and star in archive
Packit 08bd4c
creation, listing, extraction and archive-to-extracted comparison.
Packit 08bd4c
Tcp prints out best time of n=$n repetitions.
Packit 08bd4c
Packit 08bd4c
Tcp creates temporary archive named tcp.tar with $pax and some native
Packit 08bd4c
(--seek/-no-fsync) options and extracts it to [\$3]/tcptmp/.
Packit 08bd4c
If unset, third argument defaults to [\$2].
Packit 08bd4c
After normal exit tcp removes tarball and extracted files.
Packit 08bd4c
Tcp does not check filesystems destination directories are on for free space,
Packit 08bd4c
so make sure there is enough space (a bit more than source_dir uses) for both:
Packit 08bd4c
archive and extracted files.
Packit 08bd4c
Do not use white space in arguments.
Packit 08bd4c
        Jan Psota, $version"
Packit 08bd4c
        exit 0
Packit 08bd4c
}
Packit 08bd4c
src=$1
Packit 08bd4c
dst=$2/tcp.tar
Packit 08bd4c
dst_path=${3:-$2}/tcptmp
Packit 08bd4c
test -e $dst -o -e /tmp/tcp \
Packit 08bd4c
        && { echo "$dst or /tmp/tcp exists, exiting"; exit 1; }
Packit 08bd4c
mkdir $dst_path || exit 2
Packit 08bd4c
Packit 08bd4c
use_times ()
Packit 08bd4c
{
Packit 08bd4c
        awk -F"\t" -vN=$n -vL="`du -k $dst`" -vOFS="\t" -vORS="" '
Packit 08bd4c
                { if (NF==4) { printf "\t%s\t%10.1d KB/s\n", $0, ($1+0>0 ? 
Packit 08bd4c
(L+0)/($1+0) : 0) } }' \
Packit 08bd4c
                /tmp/tcp | sort | head -1
Packit 08bd4c
        > /tmp/tcp
Packit 08bd4c
}
Packit 08bd4c
Packit 08bd4c
test -d $src || { echo "'$src' is not a directory"; exit 3; }
Packit 08bd4c
Packit 08bd4c
# system information: type, release, memory, cpu(s), compiler and flags
Packit 08bd4c
echo -e "TCP, version $version\n"`uname -sr`" / "`head -1 /etc/*-release`
Packit 08bd4c
free -m | awk '/^Mem/ { printf "%dMB of memory, ", $2 }'
Packit 08bd4c
test -e /proc/cpuinfo \
Packit 08bd4c
        && awk -F: '/name|cache size|MHz|mips/ { if (!a) b=b $2 }
Packit 08bd4c
        /^$/ { a++ } END { print a" x"b" bmips" }' /proc/cpuinfo
Packit 08bd4c
test -e /etc/gentoo-release \
Packit 08bd4c
        && gcc --version | head -1 && grep ^CFLAGS /etc/make.conf
Packit 08bd4c
Packit 08bd4c
# tar versions
Packit 08bd4c
t=
Packit 08bd4c
echo
Packit 08bd4c
for tar in $TAR; do 
Packit 08bd4c
	if which $tar &> /dev/null; then
Packit 08bd4c
		t="$t $tar";
Packit 08bd4c
		echo -ne "$tar:\t"; $tar --version | head -1; 
Packit 08bd4c
	fi
Packit 08bd4c
done
Packit 08bd4c
Packit 08bd4c
TAR="$t"
Packit 08bd4c
Packit 08bd4c
echo -e "\nbest time of $n repetitions,\n"\
Packit 08bd4c
"       src=$src, "\
Packit 08bd4c
`du -sh $src | awk '{print $1}'`" in "`find $src | wc -l`" files, "\
Packit 08bd4c
"avg "$((`du -sk $src | awk '{print $1}'`/`find $src -type f | wc -l`))"KB/file,\n"\
Packit 08bd4c
"       archive=$dst, extract to $dst_path"
Packit 08bd4c
Packit 08bd4c
echo -e "program\toperation\treal\tuser\tsystem\t%CPU\t     speed"
Packit 08bd4c
> /tmp/tcp
Packit 08bd4c
let op_num=0
Packit 08bd4c
for op in "cf $dst $pax -C $src ." "tf $dst" "xf $dst -C $dst_path" \
Packit 08bd4c
        "f $dst -C $dst_path --diff"; do
Packit 08bd4c
        let tar_num=0
Packit 08bd4c
        for tar in $TAR; do
Packit 08bd4c
                echo -en "$tar\t${OPN[op_num]}\t"
Packit 08bd4c
                for ((i=1; i<=$n; i++)); do
Packit 08bd4c
                        echo $op | grep -q ^cf && rm -f $dst
Packit 08bd4c
                        echo $op | grep -q ^xf &&
Packit 08bd4c
                                { chmod -R u+w $dst_path
Packit 08bd4c
                                rm -rf $dst_path; mkdir $dst_path; }
Packit 08bd4c
                        sync
Packit 08bd4c
                        if echo $op | grep -q ^f; then  # op == compare
Packit 08bd4c
                                time $tar $op ${OPT[$tar_num]} > /dev/null
Packit 08bd4c
                        else    # op in (create | list | extract)
Packit 08bd4c
                                time $tar $op ${OPT[$tar_num]} > /dev/null \
Packit 08bd4c
                                        || break 3
Packit 08bd4c
                        fi 2>> /tmp/tcp
Packit 08bd4c
                done
Packit 08bd4c
                use_times
Packit 08bd4c
                let tar_num++
Packit 08bd4c
        done
Packit 08bd4c
        let op_num++
Packit 08bd4c
        echo
Packit 08bd4c
done
Packit 08bd4c
rm -rf $dst_path $dst
Packit 08bd4c
echo
Packit 08bd4c
cat /tmp/tcp
Packit 08bd4c
rm -f /tmp/tcp