summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore3
-rw-r--r--Makefile.am12
-rw-r--r--bench/Makefile.am25
-rw-r--r--bench/libdimension/Makefile.am30
-rw-r--r--bench/libdimension/array.c178
-rw-r--r--configure.ac11
-rw-r--r--libdimension/dimension/array.h3
-rw-r--r--tests/libdimension/Makefile.am6
8 files changed, 260 insertions, 8 deletions
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