From 273761db64335b4dd647f538efbd69a3823c5319 Mon Sep 17 00:00:00 2001
From: Tavian Barnes <tavianator@gmail.com>
Date: Sun, 4 Oct 2009 19:05:15 +0000
Subject: New benchmarking suite.

---
 .gitignore                     |   3 +
 Makefile.am                    |  12 ++-
 bench/Makefile.am              |  25 ++++++
 bench/libdimension/Makefile.am |  30 +++++++
 bench/libdimension/array.c     | 178 +++++++++++++++++++++++++++++++++++++++++
 configure.ac                   |  11 ++-
 libdimension/dimension/array.h |   3 +-
 tests/libdimension/Makefile.am |   6 +-
 8 files changed, 260 insertions(+), 8 deletions(-)
 create mode 100644 bench/Makefile.am
 create mode 100644 bench/libdimension/Makefile.am
 create mode 100644 bench/libdimension/array.c

diff --git a/.gitignore b/.gitignore
index bb691ed..ffb0082 100644
--- a/.gitignore
+++ b/.gitignore
@@ -41,6 +41,9 @@ Makefile.in
 /tests/*/*-test
 /tests/*.png
 
+# Files created by `make bench'
+/bench/*/bench-*
+
 # Files and folders created by libtool
 .libs/
 *.l[oa]
diff --git a/Makefile.am b/Makefile.am
index 574df64..b474efa 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -18,8 +18,14 @@
 ###########################################################################
 
 ACLOCAL_AMFLAGS = -I m4
-SUBDIRS = doc                                                                  \
-          libdimension                                                         \
-          tests
+SUBDIRS = libdimension                                                         \
+          tests                                                                \
+          bench                                                                \
+          doc
 
 EXTRA_DIST = autogen.sh
+
+bench: all-recursive
+	cd bench && $(MAKE) $(AM_MAKEFLAGS) bench
+
+.PHONY: bench
diff --git a/bench/Makefile.am b/bench/Makefile.am
new file mode 100644
index 0000000..7c5428d
--- /dev/null
+++ b/bench/Makefile.am
@@ -0,0 +1,25 @@
+###########################################################################
+## Copyright (C) 2009 Tavian Barnes <tavianator@gmail.com>               ##
+##                                                                       ##
+## This file is part of The Dimension Build Suite.                       ##
+##                                                                       ##
+## The Dimension Build Suite is free software; you can redistribute it   ##
+## and/or modify it under the terms of the GNU General Public License as ##
+## published by the Free Software Foundation; either version 3 of the    ##
+## License, or (at your option) any later version.                       ##
+##                                                                       ##
+## The Dimension Build Suite is distributed in the hope that it will be  ##
+## useful, but WITHOUT ANY WARRANTY; without even the implied warranty   ##
+## of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  ##
+## General Public License for more details.                              ##
+##                                                                       ##
+## You should have received a copy of the GNU General Public License     ##
+## along with this program.  If not, see <http://www.gnu.org/licenses/>. ##
+###########################################################################
+
+SUBDIRS = libdimension
+
+bench: all-recursive
+	cd libdimension && $(MAKE) $(AM_MAKEFLAGS) bench
+
+.PHONY: bench
diff --git a/bench/libdimension/Makefile.am b/bench/libdimension/Makefile.am
new file mode 100644
index 0000000..cc8c886
--- /dev/null
+++ b/bench/libdimension/Makefile.am
@@ -0,0 +1,30 @@
+###########################################################################
+## Copyright (C) 2009 Tavian Barnes <tavianator@gmail.com>               ##
+##                                                                       ##
+## This file is part of The Dimension Build Suite.                       ##
+##                                                                       ##
+## The Dimension Build Suite is free software; you can redistribute it   ##
+## and/or modify it under the terms of the GNU General Public License as ##
+## published by the Free Software Foundation; either version 3 of the    ##
+## License, or (at your option) any later version.                       ##
+##                                                                       ##
+## The Dimension Build Suite is distributed in the hope that it will be  ##
+## useful, but WITHOUT ANY WARRANTY; without even the implied warranty   ##
+## of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  ##
+## General Public License for more details.                              ##
+##                                                                       ##
+## You should have received a copy of the GNU General Public License     ##
+## along with this program.  If not, see <http://www.gnu.org/licenses/>. ##
+###########################################################################
+
+INCLUDES = -I$(top_srcdir)/libdimension
+
+EXTRA_PROGRAMS = bench-array
+
+bench_array_SOURCES = array.c
+bench_array_LDADD   = -lsandglass $(top_srcdir)/libdimension/libdimension.la
+
+bench: bench-array$(EXEEXT)
+	./bench-array$(EXEEXT)
+
+.PHONY: bench
diff --git a/bench/libdimension/array.c b/bench/libdimension/array.c
new file mode 100644
index 0000000..661ba51
--- /dev/null
+++ b/bench/libdimension/array.c
@@ -0,0 +1,178 @@
+/*************************************************************************
+ * Copyright (C) 2009 Tavian Barnes <tavianator@gmail.com>               *
+ *                                                                       *
+ * This file is part of The Dimension Benchmark Suite.                   *
+ *                                                                       *
+ * The Dimension Benchmark Suite is free software; you can redistribute  *
+ * it and/or modify it under the terms of the GNU General Public License *
+ * as published by the Free Software Foundation; either version 3 of the *
+ * License, or (at your option) any later version.                       *
+ *                                                                       *
+ * The Dimension Benchmark Suite is distributed in the hope that it will *
+ * be useful, but WITHOUT ANY WARRANTY; without even the implied         *
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See *
+ * the GNU General Public License for more details.                      *
+ *                                                                       *
+ * You should have received a copy of the GNU General Public License     *
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>. *
+ *************************************************************************/
+
+#include <dimension.h>
+#include <sandglass.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+int
+main()
+{
+  dmnsn_array *array;
+  uint32_t object = 1;
+  void *ptr;
+  size_t size;
+  unsigned int i;
+  const unsigned int count = 32;
+
+  sandglass_t sandglass;
+  sandglass_attributes_t attr = { SANDGLASS_MONOTONIC, SANDGLASS_REALTICKS };
+
+  if (sandglass_create(&sandglass, &attr, &attr) != 0) {
+    perror("sandglass_create()");
+    return EXIT_FAILURE;
+  }
+
+  /* Benchmark allocation and deallocation */
+  sandglass_bench(&sandglass, {
+    array = dmnsn_new_array(sizeof(object));
+    dmnsn_delete_array(array);
+  });
+  printf("dmnsn_new_array() + dmnsn_delete_array(): %ld\n", sandglass.grains);
+
+  /* Create our test array */
+  array = dmnsn_new_array(sizeof(object));
+
+  /* dmnsn_array_push() */
+
+  printf("dmnsn_array_push():");
+
+  sandglass_begin(&sandglass);
+  sandglass_elapse(&sandglass);
+
+  sandglass_begin(&sandglass);
+  sandglass_elapse(&sandglass);
+  sandglass.baseline = sandglass.grains;
+
+  for (i = 0; i < count; ++i) {
+    sandglass_begin(&sandglass);
+      dmnsn_array_push(array, &object);
+    sandglass_elapse(&sandglass);
+    sandglass.grains -= sandglass.baseline;
+
+    printf(" %ld", sandglass.grains);
+  }
+  printf("\n");
+
+  /* dmnsn_array_get() */
+  sandglass_bench(&sandglass, dmnsn_array_get(array, count/2, &object));
+  printf("dmnsn_array_get(): %ld\n", sandglass.grains);
+
+  /* dmnsn_array_set() */
+  sandglass_bench(&sandglass, dmnsn_array_set(array, count/2, &object));
+  printf("dmnsn_array_set(): %ld\n", sandglass.grains);
+
+  /* dmnsn_array_at() */
+  sandglass_bench(&sandglass, ptr = dmnsn_array_at(array, count/2));
+  printf("dmnsn_array_at(): %ld\n", sandglass.grains);
+
+  /* dmnsn_array_size() */
+  sandglass_bench(&sandglass, size = dmnsn_array_size(array));
+  printf("dmnsn_array_size(): %ld\n", sandglass.grains);
+
+  /* dmnsn_array_resize() */
+
+  dmnsn_array_resize(array, count);
+
+  sandglass_begin(&sandglass);
+  sandglass_elapse(&sandglass);
+
+  sandglass_begin(&sandglass);
+  sandglass_elapse(&sandglass);
+  sandglass.baseline = sandglass.grains;
+
+  sandglass_begin(&sandglass);
+    dmnsn_array_resize(array, count * 2);
+  sandglass_elapse(&sandglass);
+  sandglass.grains -= sandglass.baseline;
+  printf("dmnsn_array_resize(): %ld", sandglass.grains);
+
+  sandglass_begin(&sandglass);
+    dmnsn_array_resize(array, count);
+  sandglass_elapse(&sandglass);
+  sandglass.grains -= sandglass.baseline;
+  printf(" %ld\n", sandglass.grains);
+
+  /* dmnsn_array_insert() */
+
+  printf("dmnsn_array_insert():");
+
+  sandglass_begin(&sandglass);
+  sandglass_elapse(&sandglass);
+
+  sandglass_begin(&sandglass);
+  sandglass_elapse(&sandglass);
+  sandglass.baseline = sandglass.grains;
+
+  for (i = 0; i < count; ++i) {
+    sandglass_begin(&sandglass);
+      dmnsn_array_insert(array, count/2, &object);
+    sandglass_elapse(&sandglass);
+    sandglass.grains -= sandglass.baseline;
+
+    printf(" %ld", sandglass.grains);
+  }
+  printf("\n");
+
+  /* dmnsn_array_remove() */
+
+  printf("dmnsn_array_remove():");
+
+  sandglass_begin(&sandglass);
+  sandglass_elapse(&sandglass);
+
+  sandglass_begin(&sandglass);
+  sandglass_elapse(&sandglass);
+  sandglass.baseline = sandglass.grains;
+
+  for (i = 0; i < count; ++i) {
+    sandglass_begin(&sandglass);
+      dmnsn_array_remove(array, count/2);
+    sandglass_elapse(&sandglass);
+    sandglass.grains -= sandglass.baseline;
+
+    printf(" %ld", sandglass.grains);
+  }
+  printf("\n");
+
+  /* dmnsn_array_pop() */
+
+  printf("dmnsn_array_pop():");
+
+  sandglass_begin(&sandglass);
+  sandglass_elapse(&sandglass);
+
+  sandglass_begin(&sandglass);
+  sandglass_elapse(&sandglass);
+  sandglass.baseline = sandglass.grains;
+
+  for (i = 0; i < count; ++i) {
+    sandglass_begin(&sandglass);
+      dmnsn_array_pop(array, &object);
+    sandglass_elapse(&sandglass);
+    sandglass.grains -= sandglass.baseline;
+
+    printf(" %ld", sandglass.grains);
+  }
+  printf("\n");
+
+  dmnsn_array_delet(array);
+  return EXIT_SUCCESS;
+}
diff --git a/configure.ac b/configure.ac
index 503262a..2849b10 100644
--- a/configure.ac
+++ b/configure.ac
@@ -28,11 +28,18 @@ AC_PROG_LN_S
 AC_PROG_MAKE_SET
 AC_PROG_LIBTOOL
 
+dnl Timing library for benchmarks
+AC_CHECK_LIB([sandglass], [sandglass_create],
+             [],
+             [AC_MSG_WARN([libsandglass not found - benchmarking suite will not work correctly])])
+
 dnl Generate Makefiles
 AC_CONFIG_MACRO_DIR([m4])
 AC_CONFIG_FILES([Makefile
-                 doc/Makefile
                  libdimension/Makefile
                  tests/Makefile
-                 tests/libdimension/Makefile])
+                 tests/libdimension/Makefile
+                 bench/Makefile
+                 bench/libdimension/Makefile
+                 doc/Makefile])
 AC_OUTPUT
diff --git a/libdimension/dimension/array.h b/libdimension/dimension/array.h
index d835d60..2154a9e 100644
--- a/libdimension/dimension/array.h
+++ b/libdimension/dimension/array.h
@@ -59,7 +59,8 @@ dmnsn_new_array(size_t obj_size)
 
 /* Delete the array */
 DMNSN_INLINE void
-dmnsn_delete_array(dmnsn_array *array) {
+dmnsn_delete_array(dmnsn_array *array)
+{
   if (array) {
     free(array->ptr);
     free(array);
diff --git a/tests/libdimension/Makefile.am b/tests/libdimension/Makefile.am
index 3a0e15c..a3747d0 100644
--- a/tests/libdimension/Makefile.am
+++ b/tests/libdimension/Makefile.am
@@ -17,6 +17,8 @@
 ## along with this program.  If not, see <http://www.gnu.org/licenses/>. ##
 ###########################################################################
 
+INCLUDES = -I$(top_srcdir)/libdimension
+
 check_PROGRAMS    = error-test                                                 \
                     warning-test
 TESTS             = $(check_PROGRAMS)
@@ -25,7 +27,7 @@ XFAIL_TESTS       = error-test
 INCLUDES = -I$(top_srcdir)/libdimension
 
 error_test_SOURCES = error.c
-error_test_LDADD   = ../../libdimension/libdimension.la
+error_test_LDADD   = $(top_srcdir)/libdimension/libdimension.la
 
 warning_test_SOURCES = warning.c
-warning_test_LDADD   = ../../libdimension/libdimension.la
+warning_test_LDADD   = $(top_srcdir)/libdimension/libdimension.la
-- 
cgit v1.2.3