Add simple program to measure run-time.
authorThomas Jahns <jahns@dkrz.de>
Mon, 3 Mar 2014 14:33:42 +0000 (15:33 +0100)
committerThomas Jahns <jahns@dkrz.de>
Mon, 3 Mar 2014 15:05:36 +0000 (16:05 +0100)
src/Makefile.am
src/utime.c [new file with mode: 0644]
tests/bdec.sh
tests/benc.sh

index eeeafad..4c7a260 100644 (file)
@@ -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 (file)
index 0000000..ca83900
--- /dev/null
@@ -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;
+}
+
index 9a8544f..9dcdf79 100755 (executable)
@@ -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 "\e[0;32m*** Decoding with $perf MiB/s user time ***\e[0m"
 cmp bench.dat dec.dat
index 4ce7586..a05bd78 100755 (executable)
@@ -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 "\e[0;32m*** Encoding with $perf MiB/s user time ***\e[0m"