summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Jahns <jahns@dkrz.de>2014-03-03 15:33:42 +0100
committerThomas Jahns <jahns@dkrz.de>2014-03-03 16:05:36 +0100
commitab54a5d725736414ae5c5174958f3bbba51390b0 (patch)
treeb257b5a4c7e12580675eeb66b9e36b838d7246e8
parent64a8726ff872165c45f6866280fb80cf92fdcfcc (diff)
downloadlibaec-ab54a5d725736414ae5c5174958f3bbba51390b0.tar.gz
libaec-ab54a5d725736414ae5c5174958f3bbba51390b0.tar.bz2
libaec-ab54a5d725736414ae5c5174958f3bbba51390b0.zip
Add simple program to measure run-time.
-rw-r--r--src/Makefile.am2
-rw-r--r--src/utime.c122
-rwxr-xr-xtests/bdec.sh7
-rwxr-xr-xtests/benc.sh6
4 files changed, 126 insertions, 11 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index eeeafad..4c7a260 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -7,5 +7,7 @@ libsz_la_LIBADD = libaec.la
include_HEADERS = libaec.h szlib.h
bin_PROGRAMS = aec
+noinst_PROGRAMS = utime
+utime_SOURCES = utime.c
aec_LDADD = libaec.la
aec_SOURCES = aec.c
diff --git a/src/utime.c b/src/utime.c
new file mode 100644
index 0000000..ca83900
--- /dev/null
+++ b/src/utime.c
@@ -0,0 +1,122 @@
+/**
+ * @file utime.c
+ *
+ * @author Thomas Jahns, Deutsches Klimarechenzentrum
+ *
+ * @section LICENSE
+ * Copyright 2012 - 2014
+ *
+ * Mathis Rosenhauer, Luis Kornblueh
+ * Moritz Hanke,
+ * Joerg Behrens,
+ * Thomas Jahns
+ *
+ * Deutsches Klimarechenzentrum GmbH Max-Planck-Institut fuer Meteorologie
+ * Bundesstr. 45a Bundesstr. 53
+ * 20146 Hamburg 20146 Hamburg
+ * Germany Germany
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @section DESCRIPTION
+ *
+ * Simple timing command, since calling time(1) gives non-portable results.
+ *
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/resource.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+static int
+run_cmd(int argc, char *argv[]);
+
+int main(int argc, char **argv)
+{
+ struct timeval utime = { .tv_sec = 0, .tv_usec = 0 };
+ int status, rstatus;
+ if (argc > 1 && ((status = run_cmd(argc - 1, argv + 1)) >= 0))
+ {
+ struct rusage usage;
+ if ((rstatus = getrusage(RUSAGE_CHILDREN, &usage) == -1))
+ {
+ perror("resource usage statistics unavailable");
+ }
+ else if (rstatus != 0)
+ {
+ fputs("an unknown error occurred\n", stderr);
+ return EXIT_FAILURE;
+ }
+ else
+ {
+ utime = usage.ru_utime;
+ }
+ }
+ else if (status)
+ {
+ fputs("could not fork child\n", stderr);
+ return EXIT_FAILURE;
+ }
+ fprintf(stderr, "%f\n", (utime.tv_sec * 1000000 + utime.tv_usec)/1000000.0);
+ return status;
+}
+
+static int
+run_cmd(int argc, char *argv[])
+{
+ int status;
+ pid_t child_pid;
+ if (argc < 1)
+ return -1;
+ if ((child_pid = fork()) < 0)
+ status = -1;
+ else if (child_pid == 0)
+ {
+ /* child */
+ execvp(argv[0], argv);
+ _exit(127); /* execvp should not have returned */
+ }
+ else
+ {
+ while (waitpid(child_pid, &status, 0) < 0)
+ if (errno != EINTR)
+ {
+ status = -1;
+ break;
+ }
+ }
+ return status;
+}
+
diff --git a/tests/bdec.sh b/tests/bdec.sh
index 9a8544f..9dcdf79 100755
--- a/tests/bdec.sh
+++ b/tests/bdec.sh
@@ -9,12 +9,7 @@ if [ ! -f bench.rz ]; then
fi
rm -f dec.dat
bsize=$(stat -c "%s" bench.dat)
-utime=$(
- (
- /usr/bin/time -f "%U" $AEC -d -n16 -j64 -r256 -m -c \
- bench.rz > dec.dat
- ) 2>&1
-)
+utime=$(../src/utime $AEC -d -n16 -j64 -r256 -m -c bench.rz 2>&1 >dec.dat)
perf=$(echo "$bsize/1048576/$utime" | bc)
echo "*** Decoding with $perf MiB/s user time ***"
cmp bench.dat dec.dat
diff --git a/tests/benc.sh b/tests/benc.sh
index 4ce7586..a05bd78 100755
--- a/tests/benc.sh
+++ b/tests/benc.sh
@@ -14,11 +14,7 @@ if [ ! -f bench.dat ]; then
done
fi
rm -f bench.rz
-utime=$(
- (
- /usr/bin/time -f "%U" $AEC -n16 -j64 -r256 -m -c bench.dat > bench.rz
- ) 2>&1
-)
+utime=$(../src/utime $AEC -n16 -j64 -r256 -m -c bench.dat 2>&1 >bench.rz)
bsize=$(stat -c "%s" bench.dat)
perf=$(echo "$bsize/1048576/$utime" | bc)
echo "*** Encoding with $perf MiB/s user time ***"