Blame contrib/psota-benchmark/tcp.sh

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